<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>[꼼꼼한 개발자] 꼼코더</title>
    <link>https://ccomccomhan.tistory.com/</link>
    <description>꼼꼼한 개발자 꼼코더 입니다. </description>
    <language>ko</language>
    <pubDate>Wed, 13 May 2026 18:32:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>꼼코더</managingEditor>
    <image>
      <title>[꼼꼼한 개발자] 꼼코더</title>
      <url>https://tistory1.daumcdn.net/tistory/5593667/attach/3adf4b4417bd46e683ca89f5d7f60324</url>
      <link>https://ccomccomhan.tistory.com</link>
    </image>
    <item>
      <title>[JS] - 원시값, 래퍼 객체란? 간단하고 쉽게 이해하기(원시값도 메서드를 사용할 수 있다)</title>
      <link>https://ccomccomhan.tistory.com/302</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  간단 정리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원시값(Primitive)&lt;/b&gt;: 숫자, 문자열, boolean 등&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;변경 불가능한 단일 값&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;객체(Object)&lt;/b&gt;: 여러 값을 묶어둔 구조.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메서드(Method)&lt;/b&gt;: 객체에 붙어 있는 함수.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;원시값도 메서드를 사용할 수 있다?!&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 예! (하지만 사실은 살짝 속임수&amp;hellip;!?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  이게 무슨 말인지 아래에서 쉽게 설명하겠다!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;margin: 15px 0; text-align: center;&quot;&gt;&lt;!-- 디스플레이 광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-9910939065024756&quot; data-ad-slot=&quot;1784286195&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  원시값(Primitive Value) 이란?&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원시값(Primitive)은 자바스크립트에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;가장 기본이 되는 데이터 단위&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;속성이나 메서드를 가지지 않으며&lt;/b&gt;,&amp;nbsp;&lt;b&gt;변경(수정)할 수 없는 값&lt;/b&gt;(immutable)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;0&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;원시값 종류&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%; height: 134px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;종류&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;number&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;1, 3.14, -100, Infinity, NaN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;string&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;'hello', &quot;JavaScript&quot;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;템플릿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 15px;&quot;&gt;
&lt;td style=&quot;height: 15px;&quot;&gt;boolean&lt;/td&gt;
&lt;td style=&quot;height: 15px;&quot;&gt;true, false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;null&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;null&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;undefined&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;undefined&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;symbol&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;Symbol('id'), Symbol()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;bigint&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;123n, BigInt(999)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;근데 잠깐&amp;hellip;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;변경(수정)할 수 없는 값?? 무슨 소리!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;1&quot;&gt;아래처럼 string, number 등 전부 다 변경했었는데..?&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot; data-token-index=&quot;1&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758190884286&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let greeting = 'hi';
greeting = 'hello';&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;엄연히 말하자면 기존 문자열인 'hi'를 &amp;lsquo;hello&amp;rsquo;로 수정한 게 아니다 그림을 보고 설명을 하자면&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;greeting이 'hi'를 원시값을 할당받았다가&lt;/li&gt;
&lt;li&gt;greeting이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이제 'hello'라는 원시값을 재할당 받은 것.&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NI2Cj/btsQEHQeQQn/FqtM06FBNYEw8XxVVGrlI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NI2Cj/btsQEHQeQQn/FqtM06FBNYEw8XxVVGrlI1/img.png&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;1118&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.71&quot; style=&quot;width: 50.124722%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NI2Cj/btsQEHQeQQn/FqtM06FBNYEw8XxVVGrlI1/img.png&quot; alt=&quot;변수값에 문자열을 할당할 때 콜스택 내부 구조를 설명하는 그림&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNI2Cj%2FbtsQEHQeQQn%2FFqtM06FBNYEw8XxVVGrlI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;1118&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/23eu6/btsQGFXLUEA/pbV2mG4bDXrIvi3ZkIJQp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/23eu6/btsQGFXLUEA/pbV2mG4bDXrIvi3ZkIJQp0/img.png&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;1178&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;49.29&quot; style=&quot;width: 48.712488%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/23eu6/btsQGFXLUEA/pbV2mG4bDXrIvi3ZkIJQp0/img.png&quot; alt=&quot;변수값에 문자열을 재할당할 때 콜스택 내부 구조를 설명하는 그림&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F23eu6%2FbtsQGFXLUEA%2FpbV2mG4bDXrIvi3ZkIJQp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1708&quot; height=&quot;1178&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;원시값 재할당 예시 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;greeting은 처음 &quot;hi&quot;라는 원시값을 스택에 할당받았다가&lt;br /&gt;이후 &quot;hello&quot;라는 &lt;b&gt;전혀 다른 원시값으로&lt;/b&gt; 재할당된 것&lt;br /&gt;기존 &quot;hi&quot;는 &lt;b&gt;그 어떤 수정도 받지 않았고&lt;/b&gt;&amp;nbsp;&lt;br /&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;다시 말해 'hello'는 한번 생성되면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;절대 바뀌지 않는 것이 맞다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;그래서 원시값은 변경 및 수정할 수 없는 값이라고 한다!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;( &amp;zwj;??? : 이봐!! 그럼 &amp;lsquo;hello&amp;rsquo;는 어떻게 되는 거냐!)&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(궁금하면 아래 링크 클릭!)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1758191033722&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] - 가비지 컬렉션 (원피스로 이해하는 가비지 컬렉션)간단하고 쉽게 이해하기&quot; data-og-description=&quot; &amp;zwj;  소개&amp;ldquo;자바스크립트는 메모리 관리를 알아서 해주니까 굳이 신경 안 써도 된다&amp;rdquo;는 말이 있다실제로 &amp;ldquo;언제 메모리에서 제거되는가?&amp;rdquo; 라는 건 생각보다 깊은 개념이다. 오늘은 복&quot; data-og-host=&quot;ccomccomhan.tistory.com&quot; data-og-source-url=&quot;https://ccomccomhan.tistory.com/301&quot; data-og-url=&quot;https://ccomccomhan.tistory.com/301&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/edKYK4/hyZJshRRLy/qLt0fzHctQ57lK7mXsvfG0/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/dARy39/hyZI85FhLo/OJOpXOBS6wK5rFX003rQZk/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/bmlhwd/hyZJm21nKT/rEE7FfqmXzNkUsosilG3Kk/img.png?width=1372&amp;amp;height=810&amp;amp;face=0_0_1372_810&quot;&gt;&lt;a href=&quot;https://ccomccomhan.tistory.com/301&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ccomccomhan.tistory.com/301&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/edKYK4/hyZJshRRLy/qLt0fzHctQ57lK7mXsvfG0/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/dARy39/hyZI85FhLo/OJOpXOBS6wK5rFX003rQZk/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/bmlhwd/hyZJm21nKT/rEE7FfqmXzNkUsosilG3Kk/img.png?width=1372&amp;amp;height=810&amp;amp;face=0_0_1372_810');&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] - 가비지 컬렉션 (원피스로 이해하는 가비지 컬렉션)간단하고 쉽게 이해하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt; &amp;zwj;  소개&amp;ldquo;자바스크립트는 메모리 관리를 알아서 해주니까 굳이 신경 안 써도 된다&amp;rdquo;는 말이 있다실제로 &amp;ldquo;언제 메모리에서 제거되는가?&amp;rdquo; 라는 건 생각보다 깊은 개념이다. 오늘은 복&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ccomccomhan.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;✨ 원시값도 메서드를 쓴다?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위에서 우리는 원시값의 특징을 보았다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;속성이나 메서드를 가지지 않으며&lt;/b&gt; &amp;rarr; 맞아 객체가 아니니깐!&lt;/li&gt;
&lt;li&gt;&lt;b&gt;변경할 수 없는 값&lt;/b&gt; &amp;rarr; 응 이해했어!&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 객체가 아닌 원시값이 메서드를 사용할 수 있다는 사실..!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;아래코드를 보면 문자열은 원시값인데&amp;nbsp;.toUpperCase()&amp;nbsp;메서드가 되네??&lt;/b&gt; &lt;/span&gt; &lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;바로 자바스크립트의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;임시 객체 변환기능&amp;nbsp;덕분.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;1316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zleur/btsQEiW5cSr/KE50OyKkPD7gnibP0BqtoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zleur/btsQEiW5cSr/KE50OyKkPD7gnibP0BqtoK/img.png&quot; data-alt=&quot;임시 객체 변환 기능 예시 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zleur/btsQEiW5cSr/KE50OyKkPD7gnibP0BqtoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzleur%2FbtsQEiW5cSr%2FKE50OyKkPD7gnibP0BqtoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;임시 객체 변환으로 문자열 원시값에 마침표를 찍었을 때 콘솔에 표시되는 메서드 목록 예시 화면&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;506&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;1316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;임시 객체 변환 기능 예시 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1758191068605&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = &quot;CcomCoder&quot;;
alert(str.toUpperCase()); // CCOMCODER&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;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &amp;zwj;♀️ 원시값 &amp;rarr; 래퍼 객체(Wrapper Object)&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;래퍼 객체 :&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;원시값(primitive value)을 감싸서 객체처럼 다룰 수 있게 해주는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;기본 내장 객체&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;JS는 원시값에 접근할 때&amp;nbsp;&lt;b&gt;잠깐 동안 객체처럼 변환해 준다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쉽게 말해, 원시값을 객체처럼 사용가능한 것!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1758191095905&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const str = &quot;CcomCoder&quot;;
// 위 코드를 자바스크립트는 아래처럼 처리합니다.
const temp = new String(&quot;CcomCoder&quot;);
temp.toUpperCase(); // &quot;CCOMCODER&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;String, Number, Boolean 등 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;원시값은 모두&amp;nbsp;래퍼 객체가 있다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;메서드를 호출 시도 시 자바스크립트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;임시로 객체로 변환&lt;/b&gt;한 뒤&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;메서드 실행 후에는 다시 객체가&amp;nbsp;사라진다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  하지만 조심해야 할 점!&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;변환된 임시 객체는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;읽기만 가능&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;변경은 불가능하다는 점&lt;/b&gt;.&lt;/p&gt;
&lt;pre id=&quot;code_1758191113755&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const str = &quot;hello&quot;;
str.test = &quot;world&quot;;
console.log(str.test); // ❌ undefined&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;✋ why? (앞서 말했듯이) 임시 객체는 메서드 호출이 끝나면 바로 사라지기 때문&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; &amp;nbsp;여기서 의문점이 드시죠? (전 그랬습니다)&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다시 &lt;b&gt;원시값으로 돌아올 거면 왜 굳이 왜 변환해서 접근하는 거야? &lt;/b&gt;&amp;rarr; 객체로 선언해서 처음부터 &amp;lsquo;객체&amp;rsquo;로 해!&lt;/li&gt;
&lt;li&gt;객체, 원시값 모두 &lt;b&gt;접근할 때 전부 객체라면 JS는 2가지를 왜 구분 지어 놓은 거야?&lt;/b&gt; &amp;rarr; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;그냥 전부다 객체로 하지&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;margin: 15px 0; text-align: center;&quot;&gt;&lt;!-- 디스플레이 광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-9910939065024756&quot; data-ad-slot=&quot;1784286195&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;✅ 왜 &amp;ldquo;원시값&amp;rdquo;과 &amp;ldquo;객체&amp;rdquo;를 구분할까?&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 성능(Performance) 때문&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원시값은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;가볍고 빠르다&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모든 값이 객체였다면, 메모리 사용량이 늘고 처리 속도가 느려졌을 것!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1758191154972&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const age1 = 27; // 그냥 숫자. 메모리 한 칸에 값 저장

const age2 = new Number(27); // 객체로서 속성, 메서드, 프로토타입 등등이 따라옴&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;원시값은 그냥 메모리 한 칸에 &amp;ldquo;값&amp;rdquo;만 저장하면 되지만&lt;br /&gt;객체는 그보다 훨씬 복잡한 구조를 갖기 때문에&lt;br /&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 값 자체가 변하지 않도록 보장해야 할 때가 많다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예를 들어 문자열은 복잡한 텍스트 조작이 많기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;변하지 않는 값&lt;/b&gt;으로 다루는 게 실수도 줄이고 안전하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1758191180805&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let str = 'hello';
str.toUpperCase(); // 'HELLO' 반환, 원래 문자열은 그대로&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  요약&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바스크립트는 모든 걸 객체처럼 다룰 수 있다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다만 성능과 안정성을 위해 원시값을 따로 둔다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  개발 시 고려사항&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원시값인 문자열을 자주 조작 한다면 &quot;abc&quot; 같은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;리터럴&lt;/b&gt;을 사용하자.&lt;/li&gt;
&lt;li&gt;&amp;rArr; typeof, ===시 의도와 다르게 나올 수 있음&lt;/li&gt;
&lt;li&gt;객체처럼 .prop = value 하려고 하지 말자. 사라지기 때문..  &lt;/li&gt;
&lt;li&gt;따라서 혼란 방지를 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;원시값은 원시값답게 다루는 게 좋다!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &amp;zwj;  마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트의 원시값은 간단하지만,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;임시 객체 덕분에 마치 객체처럼&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용 가능해요.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;변경 불가, 잠깐만 존재&lt;/b&gt;라는 특성을 기억하세요!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;✅ 한 줄 요약&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;원시값은 잠깐 객체 코스프레는 가능하지만, 진짜 객체는 아니다!&amp;rdquo;  &lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>간단하고 쉽게/JS</category>
      <category>PrimitiveValue</category>
      <category>WrapperObject</category>
      <category>래퍼객체</category>
      <category>원시값</category>
      <category>원시값 객체</category>
      <category>원시값메서드</category>
      <category>원시값메소드</category>
      <category>임시객체변환</category>
      <category>자바스크립트 원시값</category>
      <category>프론트엔드</category>
      <author>꼼코더</author>
      <guid isPermaLink="true">https://ccomccomhan.tistory.com/302</guid>
      <comments>https://ccomccomhan.tistory.com/302#entry302comment</comments>
      <pubDate>Thu, 18 Sep 2025 19:32:08 +0900</pubDate>
    </item>
    <item>
      <title>[JS] - 가비지 컬렉션 (원피스로 이해하는 가비지 컬렉션)간단하고 쉽게 이해하기</title>
      <link>https://ccomccomhan.tistory.com/301</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &amp;zwj; &amp;nbsp;소개&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이 글에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;자바스크립트 가비지 컬렉션을 원피스 캐릭터에 비유해 정말 쉽게 설명하려고 한다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 참조가 끊기면 메모리에서 사라지는 원리와 Mark &amp;amp; Sweep 알고리즘, 메모리 누수 주의까지 재미있게 풀어보겠다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;(마지막 눈물 주의  )&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;margin: 15px 0; text-align: center;&quot;&gt;&lt;!-- 디스플레이 광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-9910939065024756&quot; data-ad-slot=&quot;1784286195&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  가비지 컬렉션(Garbage Collection)이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우리가 생성한 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;모든 값(변수, 객체, 함수 등)은 메모리에 저장&lt;/b&gt;&lt;/span&gt;된다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만 &amp;ldquo;더 이상 사용되지 않는 값&amp;rdquo;들&lt;/b&gt;은 불필요하게 메모리를 차지하곤 한다..&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 자바스크립트는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;자동으로 메모리를 관리해 주는&lt;/b&gt; &lt;b&gt;기능(가비지 컬렉터)&lt;/b&gt;을 가지고 있으며&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그 가비지 컬렉터&lt;/b&gt;가 이를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;자동으로 찾아서 삭제(clean up) 해주는 과정(가비지 컬렉션)을 실행&lt;/span&gt;한다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;JS는&amp;nbsp;C언어처럼 명령어로 직접 메모리를 관리하지 않아도 된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;(그렇다고 신경쓰지 않아도 된다는건 아니니 쭉 읽어보도록 하자!)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;➡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;가비지 컬렉션 (Garbage Collection)&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;불필요한 메모리를&amp;nbsp;자동으로 정리하는 메커니즘 또는 과정 = 청소 작업 자체&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;➡️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;가비지 컬렉터(Garbage Collector)&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;더 이상 사용되지 않는 메모리(데이터)를 찾아서&amp;nbsp;자동으로 정리하는 자바스크립트 엔진의 기능 =&amp;nbsp;청소부(도구)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;사용되지 않는 메모리란? (가비지 컬렉션 원리 - 사라진 해적왕 비유)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;간단히 말해, &amp;lsquo;&lt;b&gt;더 이상 참조되지 않는 값&amp;rsquo;을 말한다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래 코드에서 변수에 객체를 할당한 후 null을 재할당하는 과정을 확인해 보자!&lt;/p&gt;
&lt;pre id=&quot;code_1758242604566&quot; class=&quot;cs&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// 사람들은 해적왕을 로저라고 기억했습니다.(1번 사진) 
//  &amp;zwj;♂️ : 해적왕은 누가 뭐래도 'Roger'야!!
let pirateKing = {
  name: &quot;Roger&quot;
};

// 하지만 점점 해적왕이라는 말 자체가 사라지게 되고.. (2번 사진)
pirateKing = null; 


// 자연스레 로저라는 인물도 잊혀져갔습니다..
// 따라서, 로저는 메모리에서 제거(가비지 컬렉션)됩니다. (2번 사진)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dm0B54/btsQGsRGffr/XIUq9XWZXkuK2Ih21oZu41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dm0B54/btsQGsRGffr/XIUq9XWZXkuK2Ih21oZu41/img.png&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;772&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;49.66&quot; style=&quot;width: 49.083116%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dm0B54/btsQGsRGffr/XIUq9XWZXkuK2Ih21oZu41/img.png&quot; alt=&quot;변수가 객체를 참조하는 단일 참조 구조 예시&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdm0B54%2FbtsQGsRGffr%2FXIUq9XWZXkuK2Ih21oZu41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qzXE9/btsQEnYkW1p/1sDzBSSeawimHLQfKBTPq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qzXE9/btsQEnYkW1p/1sDzBSSeawimHLQfKBTPq0/img.png&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;810&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.34&quot; style=&quot;width: 49.754093%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qzXE9/btsQEnYkW1p/1sDzBSSeawimHLQfKBTPq0/img.png&quot; alt=&quot;모든 변수가 객체 참조를 끊어 가비지 컬렉션 대상이 된 구조&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqzXE9%2FbtsQEnYkW1p%2F1sDzBSSeawimHLQfKBTPq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;사용되지 않는 메모리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;객체 { name: &quot;Roger&quot; }는 더 이상 접근할 방법이 없다&lt;/b&gt;. &amp;rarr; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;따라서 GC의 대상.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  두 개의 참조 - 2개의 타이틀을 가진 사나이&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또 다른 예시를 확인해 보자!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사람들은 해적왕을 '로저'라고 정했습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;'&lt;b&gt;전설의 해적'은 자연스레 '해적왕'이 되었죠.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758186785517&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let pirateKing = {
  name: &quot;Roger&quot;
};


let legendaryPirate = pirateKing;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLHQj2/btsQGlLNeZe/MbtsNgCuYaNlptcPXbRcE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLHQj2/btsQGlLNeZe/MbtsNgCuYaNlptcPXbRcE0/img.png&quot; data-alt=&quot;하나의 객체를 두 개의 변수가 동시에 참조하는 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLHQj2/btsQGlLNeZe/MbtsNgCuYaNlptcPXbRcE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLHQj2%2FbtsQGlLNeZe%2FMbtsNgCuYaNlptcPXbRcE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;자바스크립트 객체 참조 예시&quot; loading=&quot;lazy&quot; width=&quot;479&quot; height=&quot;264&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하나의 객체를 두 개의 변수가 동시에 참조하는 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간이 지나 &lt;b&gt;'해적왕'&lt;/b&gt;이라는 호칭 자체가 &lt;b&gt;사라졌습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758186894583&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pirateKing = null;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;b&gt;여전히 로저는 '전설의 해적'인건 변함이 없었죠&lt;/b&gt; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;*(GC 대상 아님!)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfaQIY/btsQDYSAGjo/hqSezt8wBh155KtUHcpk71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfaQIY/btsQDYSAGjo/hqSezt8wBh155KtUHcpk71/img.png&quot; data-alt=&quot;한 변수가 참조를 끊었지만 다른 변수가 여전히 객체를 참조하는 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfaQIY/btsQDYSAGjo/hqSezt8wBh155KtUHcpk71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfaQIY%2FbtsQDYSAGjo%2FhqSezt8wBh155KtUHcpk71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;한 변수가 참조를 끊었지만 다른 변수가 여전히 객체를 참조하는 구조&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;261&quot; data-origin-width=&quot;1610&quot; data-origin-height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한 변수가 참조를 끊었지만 다른 변수가 여전히 객체를 참조하는 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 점차 '전설의 해적' &lt;b&gt;호칭도 사라지게 되었고&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758186920185&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;legendaryPirate = null;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;자연스레 '&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;전설의 해적'이자 '해적왕'이었던 '로져'는 거론될 호칭이 없어 완전히 잊혀 갔습니다..&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;따라서, 로저는 메모리에서 제거(가비지 컬렉션)됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crjP2B/btsQFZvGAQY/McfowDDkyyKs7IHbLCaUT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crjP2B/btsQFZvGAQY/McfowDDkyyKs7IHbLCaUT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crjP2B/btsQFZvGAQY/McfowDDkyyKs7IHbLCaUT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrjP2B%2FbtsQFZvGAQY%2FMcfowDDkyyKs7IHbLCaUT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;두 변수가 모두 참조를 끊어 객체가 GC 대상이 된 구조&quot; loading=&quot;lazy&quot; width=&quot;408&quot; height=&quot;277&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해 &amp;lsquo;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;접근할 수 없다면 GC의 대상이 되는구나!&amp;rsquo;라고&lt;/span&gt;&lt;/b&gt; 이해하면 쉽다!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 감이 잡혔다면 이어서&lt;span&gt; &lt;/span&gt;&lt;b&gt;GC에 대해서 자세히 &amp;nbsp;알아보자&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; 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;style6&quot; /&gt;
&lt;div style=&quot;margin: 15px 0; text-align: center;&quot;&gt;&lt;!-- 디스플레이 광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-9910939065024756&quot; data-ad-slot=&quot;1784286195&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  GC가 동작하는 시점은?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;명시적인 타이밍 없이 백그라운드에서 주기적으로 메모리를 검사하고 GC를 수행&lt;/b&gt;한다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 동작은 V8 엔진, SpiderMonkey, Chakra 등 엔진마다 방식이 다를 수 있지만, 원리는 비슷&lt;/b&gt;하다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;자바스크립트 Mark &amp;amp; Sweep 알고리즘 (가비지 컬렉션 핵심)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트는 우리 대신&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;필요 없는 메모리를 정리해 주는&lt;/b&gt; 똑똑한 청소 시스템을 갖고 있다 했는데&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그 시스템이 작동하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;가장 대표적인 방식&lt;/b&gt;이 바로 &amp;ldquo;&lt;b&gt;Mark &amp;amp; Sweep(표시하고 쓸어버리기)&amp;rdquo;이다&lt;/b&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  작동 방식&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&amp;lsquo;루트(Root)&amp;rsquo;부터 출발해서&amp;nbsp;도달 가능한 객체를 &amp;lsquo;Mark(표시)&lt;/b&gt;&lt;/span&gt;&amp;rsquo;하고.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;도달할 수 없는 객체는 &amp;lsquo;&lt;b&gt;Sweep(제거)&lt;/b&gt;&amp;rsquo;&lt;/span&gt;한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;루트(Root) 간단설명&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전역 변수 (let, var, const로 선언된 변수들)&lt;/li&gt;
&lt;li&gt;현재 실행 중인 함수의 지역 변수&lt;/li&gt;
&lt;li&gt;클로저에서 참조되는 변수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해 &amp;lsquo;&lt;b&gt;접근 가능한 값은 남기고, 쓸모없는 값은 쓸어버리는&amp;rsquo; 메모리 청소 방식&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lXj1z/btsQEEMAXqz/dyVoKm728zuXtYNI9TihPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lXj1z/btsQEEMAXqz/dyVoKm728zuXtYNI9TihPk/img.png&quot; data-alt=&quot;Mark &amp;amp;amp; Sweep 알고리즘 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lXj1z/btsQEEMAXqz/dyVoKm728zuXtYNI9TihPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlXj1z%2FbtsQEEMAXqz%2FdyVoKm728zuXtYNI9TihPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;자바스크립트 메모리 관리 Mark and Sweep 가비지 컬렉션 동작 원리&quot; loading=&quot;lazy&quot; width=&quot;490&quot; height=&quot;318&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;914&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Mark &amp;amp; Sweep 알고리즘 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  메모리 누수(Memory Leak) 주의!&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자동 청소 기능 가비지 컬렉션이 있다고 해도,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;메모리 누수는 실제로 자주 발생할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;간단하게 2가지 정도만 알아보자!&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  전역 변수에 계속 데이터 추가 - 저격왕의 가면&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1758187447733&quot; class=&quot;ceylon&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;//   (써니호)창고에 소중히 보관 중인 저격왕 가면
let warehouse = {
  item: &quot;저격왕 가면&quot;
};&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아무도 쓰지 않지만, 여전히 (전역변수) 창고에 들어 있으므로 메모리에서 제거되지 않음!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  타이머(setInterval, setTimeout) 사용 후 해제 안 함 - 쵸파의 럼블볼&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;let rumbleBall = { type: &quot;3단 변신 캡슐&quot; };

// 쵸파가 5초 뒤에 변신할 준비
setTimeout(() =&amp;gt; {
  console.log(`${rumbleBall.type} 덕분에 쵸파가 변신 준비 완료!`);
}, 5000);

// 쵸파가 실수로 럼블볼을 잃어버림 
rumbleBall = null;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;rumbleBall&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;은 &lt;b&gt;null로 재할당&lt;/b&gt;되었지만&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;setTimeout의 &lt;b&gt;콜백 함수가 클로저 형태로 이전 변수(rumbleBall)를 참조하고 있어서&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;자바스크립트 엔진은 아직 메모리에서 제거하지 않는다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt;즉, 함수가 실행되어 참조가 완전히 끊기기 전까지는 해당 객체가 메모리에 남아 있게 된다.&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;따라서 꼭 clearTimeout이나 clearInterval을 써서 정리해 주도록 하자!&lt;/span&gt; &lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이제 마지막 감동의 스토리 예재를 끝으로 마무리해 보겠다!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;margin: 15px 0; text-align: center;&quot;&gt;&lt;!-- 디스플레이 광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-9910939065024756&quot; data-ad-slot=&quot;1784286195&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;☠️&amp;nbsp;마크 앤 스위프 (Mark &amp;amp; Sweep)예제 - 메모리가 언제 죽는다고 생각하나?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;원피스의 &amp;lsquo;&lt;b&gt;드럼왕국(drumKingdom)&amp;rsquo;&lt;/b&gt;에는 &lt;b&gt;의사가 3명이 있었다&lt;/b&gt;. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;[히루루크, 쿠레하, 쵸파]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758187537055&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function connectDoctors(hiruluk, kureha, chopper) {
  hiruluk.friend = kureha;        // '히루루크' 친구는 '쿠레하'
  hiruluk.son = chopper;          // '히루루크' 아들은 '쵸파'

  kureha.friend = hiruluk;        // '쿠레하' 친구는 '히루루크'
  kureha.student = chopper;       // '쿠레하' 의료제자는 '쵸파'

  chopper.father = hiruluk;       // '쵸파' 아버지는 '히루루크'
  chopper.teacher = kureha;       // '쵸파' 스승은 '쿠레하'

  return {
    firstDoctor: hiruluk,
    secondDoctor: kureha,
    thirdDoctor: chopper
  };
}

// 드럼왕국의 의사 명단
let drumKingdom = connectDoctors(
  { name: &quot;히루루크&quot; },
  { name: &quot;쿠레하&quot; },
  { name: &quot;쵸파&quot; }
);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;히루루크와 쿠레하는 &lt;b&gt;서로를 친구라고 생각했었다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쵸파는&lt;/b&gt; 쿠레하를 &amp;lsquo;&lt;b&gt;의료스승&amp;rsquo;으로&lt;/b&gt; 히루루크는 &lt;b&gt;&amp;lsquo;아버지&amp;rsquo;처럼 따랐다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쿠레하는 쵸파를 &amp;lsquo;&lt;b&gt;의료 제자&amp;rsquo;&lt;/b&gt;로 여겼고&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;히루루크는 쵸파를 &amp;lsquo;&lt;b&gt;아들&amp;rsquo;&lt;/b&gt;처럼 여겼다&amp;hellip;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpnu8N/btsQGohsOZf/xQMpfIRYNQDWfB1yqWhybK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpnu8N/btsQGohsOZf/xQMpfIRYNQDWfB1yqWhybK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpnu8N/btsQGohsOZf/xQMpfIRYNQDWfB1yqWhybK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpnu8N%2FbtsQGohsOZf%2FxQMpfIRYNQDWfB1yqWhybK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;세 객체가 서로를 참조하는 복잡한 관계 구조&quot; loading=&quot;lazy&quot; width=&quot;511&quot; height=&quot;314&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;하지만 쿠레하는 &lt;b&gt;히루루크의 만행&lt;/b&gt;(강도, 방화, 평범한 감기를 중증으로 악화..등)을 보고 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;친구관계를 끊었다..&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758187751526&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete drumKingdom.secondDoctor.friend;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;며칠 뒤 아픈 히루루크를 위해 &lt;b&gt;쵸파는 약을 가지고 왔다&lt;/b&gt;.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쵸파가 약인 줄 알고 가져온 ☠️ &lt;b&gt;독버섯 수프를 먹고 위독해진 히루루크&lt;/b&gt;는&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쵸파에게 사실을 숨긴 채 &lt;b&gt;드럼왕국으로 달려가 죽음을 기다린다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이때 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;드럼왕국 은 &amp;lsquo;히루루크&amp;rsquo;가 곧 죽을 것을 알고 첫 번째 의사 명단에서 제외시킨다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1758187901309&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete drumKingdom.firstDoctor;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/schId/btsQCTqfOrq/XtHTbzSrN8dWp2AOANFKRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/schId/btsQCTqfOrq/XtHTbzSrN8dWp2AOANFKRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/schId/btsQCTqfOrq/XtHTbzSrN8dWp2AOANFKRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FschId%2FbtsQCTqfOrq%2FXtHTbzSrN8dWp2AOANFKRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;객체 일부 삭제 후 남은 참조 관계를 나타내는 구조&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;295&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;히루루크는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;쿠레하에게 손절당하고, 왕국에서도 잊혔다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;하지만 GC에 의해 사라지지 않는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;바로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;여전히 그를 &amp;lsquo;아버지(father)&amp;rsquo;로 기억해 주는 단 하나의 존재 &amp;lsquo;쵸파&amp;rsquo;가 있기 때문이다..&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&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;1304&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1qZZI/btsQD1nI52K/UYFIzE6SuzAKJtTkmLeBn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1qZZI/btsQD1nI52K/UYFIzE6SuzAKJtTkmLeBn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1qZZI/btsQD1nI52K/UYFIzE6SuzAKJtTkmLeBn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1qZZI%2FbtsQD1nI52K%2FUYFIzE6SuzAKJtTkmLeBn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;여전히 하나의 참조가 남아 있어 GC 대상이 되지 않는 객체 구조&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;304&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;사라지지 않는 히루루크가 말한다&lt;/b&gt;. &lt;b&gt;(BGM ON)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;audio controls=&quot;controls&quot;&gt;
  &lt;source src=&quot;https://www.dropbox.com/scl/fi/b5pvemdfcx67mg2yxzzh1/1.mp3?rlkey=wli8uw9n3rnew7fcw1gwabi1p&amp;amp;st=fylu5l9i&amp;amp;raw=1&quot; type=&quot;audio/mpeg&quot; /&gt;
  브라우저가 오디오를 지원하지 않습니다.
&lt;/audio&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어이, 메모리는&amp;hellip; 언제 죽는다고 생각하나&amp;middot;&amp;middot;&amp;middot;?&amp;rdquo;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&lt;b&gt;오류가 났을 때&lt;/b&gt;&amp;hellip;? 아니.&amp;rdquo;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&lt;b&gt;delete 키워드를 만났을 때&lt;/b&gt;&amp;hellip;? 아니야!!&amp;rdquo;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&amp;ldquo;&amp;middot;&amp;middot;&amp;middot;&amp;rsquo; 루트객체&amp;rsquo;에게서 잊혀졌을 때다&amp;middot;&amp;middot;&amp;middot;!!!&amp;rdquo;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nJV5K/btsQGt39Iwd/5oraqcCn29xWLzHZVGzJIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nJV5K/btsQGt39Iwd/5oraqcCn29xWLzHZVGzJIK/img.png&quot; data-alt=&quot;가비지 컬렉션 이미지 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nJV5K/btsQGt39Iwd/5oraqcCn29xWLzHZVGzJIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnJV5K%2FbtsQGt39Iwd%2F5oraqcCn29xWLzHZVGzJIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;루트 객체로부터 접근 불가능한 객체가 GC로 제거되는 것을 애니메이션 그림으로 설명&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;382&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가비지 컬렉션 이미지 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(정확히는 루트 객체에서 접근 불가할 때 입니다  )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;마무리&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;잘 이해가 되셨나요? 이해가 잘 되셨으면 좋겠네요!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;br /&gt;자바스크립트 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;메모리 관리와 가비지 컬렉션의 원리를 알면, 불필요한 메모리 누수를 방지하고 성능을 최적화할 수 있습니다&lt;/b&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 특히 &lt;b&gt;대규모 프로젝트에서는 메모리 관리가 안정성과 직결되므로 꼭 알아두시면 좋습니다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;⁇ 번외 편 : 루트가 끊기게 된다면? - 버스터콜 발동&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버스터콜 &amp;rArr; 드럼왕국 지도에서 삭제 &amp;rArr; 의사들 접근 불가 &amp;rArr; GC 대상!&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1758188260974&quot; class=&quot;ini&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;drumKingdom = null&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vfhOx/btsQFBn0u0T/vH8FutjAsiRWEIOUIk3Vi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vfhOx/btsQFBn0u0T/vH8FutjAsiRWEIOUIk3Vi0/img.png&quot; data-alt=&quot;루트 객체가 접근할 수 없을때 GC 대상이 되는 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vfhOx/btsQFBn0u0T/vH8FutjAsiRWEIOUIk3Vi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvfhOx%2FbtsQFBn0u0T%2FvH8FutjAsiRWEIOUIk3Vi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;루트 객체 자체가 사라져 모든 내부 객체가 가비지 컬렉션 대상이 된 구조&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;360&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;루트 객체가 접근할 수 없을때 GC 대상이 되는 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>간단하고 쉽게/JS</category>
      <category>garbage collection</category>
      <category>Garbage Collector</category>
      <category>gc</category>
      <category>Mark &amp;amp; Sweep</category>
      <category>가비지컬렉션</category>
      <category>가비지컬렉터</category>
      <category>루트객체</category>
      <category>마크앤스위프</category>
      <category>메모리누수</category>
      <category>자바스크립트 가비지컬렉션</category>
      <author>꼼코더</author>
      <guid isPermaLink="true">https://ccomccomhan.tistory.com/301</guid>
      <comments>https://ccomccomhan.tistory.com/301#entry301comment</comments>
      <pubDate>Thu, 18 Sep 2025 19:01:32 +0900</pubDate>
    </item>
    <item>
      <title>[JS] - 자바스크립트 동작 원리 간단하고 쉽게 이해하기(콜스택, 이벤트 루프, 태스크 큐)</title>
      <link>https://ccomccomhan.tistory.com/300</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  간단 정리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;JS 엔진&lt;/b&gt;: 자바스크립트 코드를 읽고, 해석하고, 실행하는 프로그램&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;싱글 스레드&lt;/b&gt; : 한 번에 하나의 작업만 처리 가능한 개념.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Web API&lt;/b&gt; : 한 번에 여러 작업이 가능한 비동기 처리 도우미. (브라우저/Node가 제공)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예) setTimeout, fetch, DOM 이벤트, Node의 fs, http 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;콜스택(Call Stack)&lt;/b&gt; : 함수 실행이 쌓이는 스택. 실행 끝나면 빠져나옴.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;태스크 큐(Task Queue)&lt;/b&gt; : 완료된 Web API(비동기)의 속에 있는 &lt;b&gt;콜백 함수&lt;/b&gt;가 대기하는 공간&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이벤트 루프(Event Loop)&lt;/b&gt; : (콜스택 비어있음 확인 후) 태스크 큐에서 대기하던 콜백을 꺼내 콜스택으로 전달&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 내용만 봐서는 모르는 게 당연합니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;아래에 정말 정말 재밌고 쉽게 설명했으니 꼭! 확인해 보세요!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(개념 훝고 -&amp;gt;&amp;nbsp; 맨 마지막 영상을 보시면 완벽하게 이해할 수 있어요!)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;margin: 15px 0; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;!-- 디스플레이 광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-9910939065024756&quot; data-ad-slot=&quot;1784286195&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/span&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;si&amp;lt;hze16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;☕️ 자바스크립트는 싱글 스레드 - 우리 카페는 바리스타가 1명&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;브라우저 속에 있는 &lt;b&gt;자바스크립트 엔진&lt;/b&gt;은 자바스크립트 코드를 읽고 &lt;b&gt;실행합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다만&lt;b&gt; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;싱글 스레드이기에 동시에 실행하지 못하고 한 줄씩 차례대로 처리&lt;/span&gt;&lt;/b&gt;해야 하죠.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 자바스크립트는 &lt;b&gt;싱글 스레드 언어라고 불립니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vkBlI/btsQudVYVjM/k0Zg0VGgug0nz1Ax9pPK41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vkBlI/btsQudVYVjM/k0Zg0VGgug0nz1Ax9pPK41/img.png&quot; data-alt=&quot;싱글 스레드 이미지 비유설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vkBlI/btsQudVYVjM/k0Zg0VGgug0nz1Ax9pPK41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvkBlI%2FbtsQudVYVjM%2Fk0Zg0VGgug0nz1Ax9pPK41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;자바스크립트 싱글 스레드를 카페의 한 명 바리스타에 비유한 그림&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;396&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;싱글 스레드 이미지 비유설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  비유설명&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마치 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;카페&lt;/b&gt;에 &lt;b&gt;바리스타(JS 엔진)가 한 명뿐인 상황&lt;/b&gt;과 같습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;손님이 커피 주문하면 &amp;rarr; 바리스타는 바로 커피를 만듭니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동시에 다른 손님들이 주문하여도 동시에 만들 수 없이 &lt;b&gt;한 사람씩 차례대로&lt;/b&gt; 처리해야 하죠.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  결국, 중요한 건 &lt;b&gt;바리스타(JS 엔진)가 주문(&lt;span style=&quot;background-color: #f6e199;&quot;&gt;함수)을 차례대로 실행&lt;/span&gt;하는 것입니다.&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(??? : 내가 아는 바리스타는 동시에 음료 여러개 만들던데요?!!?)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  콜스택(Call Stack) - 할 일 모음 집&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;콜스택(Call Stack)&lt;/b&gt;은 &lt;b&gt;실행할 함수가 담겨있는 공간&lt;/b&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;먼저 들어온 요소가 나중에 나가는 &amp;lsquo;스택 구조(LIFO)&amp;rsquo;이죠&lt;/b&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;함수 실행&lt;/b&gt; &amp;rarr; 스택에 push, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;실행 종료&lt;/b&gt; &amp;rarr; 스택에서 pop&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3UwwF/btsQtPHO1UR/uCrYJc3uEjIp36RfT1kQ61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3UwwF/btsQtPHO1UR/uCrYJc3uEjIp36RfT1kQ61/img.png&quot; data-alt=&quot;콜 스택 이미지 비유설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3UwwF/btsQtPHO1UR/uCrYJc3uEjIp36RfT1kQ61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3UwwF%2FbtsQtPHO1UR%2FuCrYJc3uEjIp36RfT1kQ61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;콜스택을 바리스타의 할 일 메모지로 설명한 그림&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;389&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;콜 스택 이미지 비유설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  비유설명&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;스택은&amp;nbsp;&lt;b&gt;바리스타(JS 엔진)&lt;/b&gt;의 &lt;b&gt;할 일 메모지&lt;/b&gt; &lt;b&gt;모음집&lt;/b&gt; 같은 존재입니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;ldquo;아메리카노 만들기&amp;rdquo; 메모 붙임(&lt;span style=&quot;background-color: #f6e199;&quot;&gt;push&lt;/span&gt;)&lt;/b&gt; &amp;rarr; &lt;b&gt;끝나면 메모 떼기&lt;span style=&quot;background-color: #f6e199;&quot;&gt;(pop)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;ldquo;라떼 만들기&amp;rdquo; 메모 붙임&lt;/b&gt;(&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;push&lt;/span&gt;&lt;/b&gt;) &amp;rarr; 끝나면 메모 &lt;b&gt;떼기(&lt;span style=&quot;background-color: #f6e199;&quot;&gt;pop&lt;/span&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  결국, &lt;b&gt;콜스택(할 일 모음집)&lt;/b&gt;은 &lt;b&gt;바리스타(JS 엔진)&lt;/b&gt;가 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;어떤 일들을 처리 중인지 확인하는 공간&lt;/span&gt;입니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  비동기 처리(Web API) - 만능 알바생 등장이요&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이전에 &lt;b&gt;JS 엔진(바리스타)&lt;/b&gt;은&amp;nbsp;&lt;b&gt;싱글 스레드이기에&lt;/b&gt;&amp;nbsp;한 번에 하나의 일만 처리할 수 있다고 했는데..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;만약 콜스택(할 일 메모지)에 &amp;lsquo;긴 작업(예: 오래 걸리는 계산)&amp;rsquo;이 쌓여 있다면?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  그동안&amp;nbsp;&lt;b&gt;버튼 클릭 이벤트나 모달 열기&lt;/b&gt;&amp;nbsp;같은 동작이 전혀 처리되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;즉, 화면이 &amp;ldquo;먹통&amp;rdquo;처럼 멈춘 것처럼 보이게 되죠.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;  비유하자면,&lt;/span&gt;&lt;b&gt;&amp;nbsp;바리스타가 너무 바빠서 손님 주문이 줄줄이 쌓여 있는 상황과 같습니다&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이럴 때 필요한 게 &lt;b&gt;비동기 처리!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;비동기 처리를 활용하면 동시에 여러 일을 효율적으로 처리할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;비동기 처리 종류 : Web API(setTimeout, fetch), DB 요청, 파일 읽기&lt;/b&gt; 등..&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;(다만, 이 글에서는 &lt;/span&gt;&lt;b&gt;Web API를 이용한 비동기 처리&lt;/b&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;만 다루겠습니다!)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  (번외) Web API 목록 - 만능 알바생의 능력치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;setTimeout, DOM 이벤트, fetch&amp;hellip; 등&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;setTimeout&lt;/b&gt;&amp;nbsp;&amp;rarr; &amp;ldquo;3초 뒤에 실행해 줘&amp;rdquo;라고 알바생(Web API)에게 맡김&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;fetch&lt;/b&gt;&amp;nbsp;&amp;rarr; 서버에 요청 보내고, 응답 오면 알려줌&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;addEventListener&lt;/b&gt;&amp;nbsp;&amp;rarr; 클릭이 발생할 때까지 계속 기다려줌&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이렇게 하면 &amp;lsquo;메인 스레드(JS 엔진)&amp;rsquo;는 다른 일을 처리하면서도, 나중에 일이 끝났을 때 다시 실행할 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKhJWL/btsQwHuMUDp/avgMJtJsPOMthww0qcdrok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKhJWL/btsQwHuMUDp/avgMJtJsPOMthww0qcdrok/img.png&quot; data-alt=&quot;Web API 이미지 비유설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKhJWL/btsQwHuMUDp/avgMJtJsPOMthww0qcdrok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKhJWL%2FbtsQwHuMUDp%2FavgMJtJsPOMthww0qcdrok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Web API를 주방 알바생으로 비유해 비동기 처리를 설명한 그림&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;430&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Web API 이미지 비유설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  비유설명&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바리스타는 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;한번에 하나의 일만 처리가 가능하기에 &lt;/span&gt;&lt;b&gt;주방 알바생(Web API)에게 도움을 요청합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;ldquo;2분 뒤에 샌드위치 만들어줘(setTimeout)&amp;ldquo;&lt;/b&gt;라고 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;부탁 후 바리스타는 다른 주문을 처리할 수 있어요&lt;/b&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주방 알바생이&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt; 2분 후 시간이 되면 &amp;ldquo;다 됐습니다!&amp;rdquo; 하고 픽업대에 올려놓습니다&lt;/b&gt;&lt;/span&gt;.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;zwj;  &lt;b&gt;알바생&lt;/b&gt; : &amp;ldquo;다 만들었고 &lt;b&gt;픽업대(task Queue)에&lt;/b&gt; 올려놓을테니 나머지 &lt;b&gt;작업(콜백함수)은 대신해주세요!&quot;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;태스크 큐(Task Queue)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. Web API가 작업을 마무리 후&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 그 속에 있는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;콜백 함수(남은 작업)를 태스크 큐에 올려 차례대로 올려놓습니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;3. 콜백 함수들은 올려진 순서대로 실행될 차례를 기다리며 대기&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대기하는 이유? =&amp;gt; &lt;b&gt;콜스택이 비워지기 전에는 실행이 불가하기 때문.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;큐는&amp;nbsp;&lt;/span&gt;&lt;b&gt;먼저 들어온 요소가 먼저 나가는(FIFO)&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 구조입니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xU6dl/btsQvDzQB2g/0wMA2KDWlG52Cbk5dCgg6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xU6dl/btsQvDzQB2g/0wMA2KDWlG52Cbk5dCgg6K/img.png&quot; data-alt=&quot;Task Queue 이미지 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xU6dl/btsQvDzQB2g/0wMA2KDWlG52Cbk5dCgg6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxU6dl%2FbtsQvDzQB2g%2F0wMA2KDWlG52Cbk5dCgg6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Task Queue를 픽업대로 비유해 콜백 함수가 대기하는 구조 설명&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;446&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Task Queue 이미지 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  비유설명&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;알바생(Web API)이 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;완료 후 남은 작업(콜백함수)들을 &amp;lsquo;픽업대(Task Queue)&amp;rsquo;에 올려놓았네요.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;남은 작업(콜백 함수)은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;바로 바리스타에게 가지 않고 '픽업대(Task Queue)'에 줄 서서 대기&lt;/span&gt;&lt;/b&gt;합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;왜냐고요? &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;아직도 바리스타(Call Stack)의 일이 끝나지 않았기 때문이죠&lt;/b&gt;&lt;/span&gt;!&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(??? : 바리스타 아직까지도 아메리카노 만들고 있네)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(??? : 우리 팀 바리스타 뭐 함?)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  이벤트 루프(Event Loop) - 악덕 매니저 등장 (바리스타 퇴사각)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이벤트 루프(Event Loop)&lt;/b&gt;는 2가지 역할을 가지고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;콜스택이 비어 있는지 확인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비어 있으면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;태스크 큐(Task Queue)&lt;/b&gt;에서 대기 중인 &lt;b&gt;콜백 함수&lt;/b&gt;를 하나씩 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;&lt;b&gt;콜스택(Call Stack)&lt;/b&gt;에 전달&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;중요한 점은 항시적으로 확인하는 것이 아닙니다!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;처리해야 할 태스크가 있는 경우&lt;/b&gt;: 먼저 들어온 태스크부터 순차적으로 처리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;처리해야 할 태스크가 없는 경우&lt;/b&gt;: 잠들어 있다가 새로운 태스크가 추가되면 다시 '1'로 돌아감&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FyJCq/btsQvNPQUiJ/avQxat0uWxs1PJBYK26Zl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FyJCq/btsQvNPQUiJ/avQxat0uWxs1PJBYK26Zl1/img.png&quot; data-alt=&quot;Event Loop 이미지 비유설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FyJCq/btsQvNPQUiJ/avQxat0uWxs1PJBYK26Zl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFyJCq%2FbtsQvNPQUiJ%2FavQxat0uWxs1PJBYK26Zl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;이벤트 루프를 카페 매니저로 표현해 태스크 큐와 콜스택을 연결하는 그림&quot; loading=&quot;lazy&quot; width=&quot;373&quot; height=&quot;373&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Event Loop 이미지 비유설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  비유설명&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;매니저(Event Loop)는 평소에는 꾸벅꾸벅 졸고 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;바리스타(Call Stack)가&amp;nbsp;&amp;nbsp;모든 일을 마무리하고 손이 비면,&lt;/b&gt;&lt;/span&gt; 얼른 픽업대(Task Queue)에 있는 샌드위치(&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;콜백 함수) 1개를 가져와 바리스타에게 전달&lt;/b&gt;&lt;/span&gt;합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;바리스타는 남은 작업(콜백 함수)인 샌드위치를 데우며(함수 실행) 작업을 계속 진행&lt;/b&gt;합니다.&lt;/span&gt;&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(??? : 어제 그 바리스타분 왜 안 보이시지?)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;b&gt;이제 얼추 개념은 이해했으니 예제 코드를 보면서 확인해 봅시다.&lt;/b&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  예제 코드 - 자바스크립트 동작 순서(JavaScript event loop video)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;예제 코드 확인 후 영상 아래 설명을 참고해 주세요!!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설명 부분을 반복해서 보다 보면 완벽히 이해가 되실 겁니다!&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1757588249267&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// 함수 선언 영역
function First() { console.log('1') }
function Second() { console.log('2') }
function Third() { console.log('3') }

// 함수 실행 영역
First();
setTimeout(Second, 5000);
Third();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이해하기 쉽게 비유도 참고해 봅니다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-  ️&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;브라우저&lt;/span&gt;&lt;/b&gt; = JS 엔진이 있는 곳 = &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;카페 =&amp;nbsp;&lt;/span&gt; 바리스타의 소속&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;-   &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;JS 엔진&lt;/b&gt; = &lt;/span&gt;&lt;/span&gt;바리스타 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;= Call Stack 속 작업(함수) 실행자&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-  &amp;zwj;♂️ &lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;JS 함수&lt;/span&gt;&lt;/b&gt; =&amp;nbsp; 손님의 주문 =&amp;nbsp; First(),&amp;nbsp; Second(), Third(), console.log()&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-   &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;Call Stack&lt;/b&gt; =&amp;nbsp;&lt;/span&gt; 할 일 모음 집&amp;nbsp; = 함수가 모여져 있는 곳 *원시값 변수도 저장되는 공간이지만 여기선 패스!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-  &amp;zwj; &amp;nbsp;&lt;b&gt;Web Apis&lt;/b&gt;&amp;nbsp;= 알바생(도우미) = 비동기 작업 처리자&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-  ️ &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;Task Queue(CallBack Queue)&lt;/b&gt;&lt;span&gt;&amp;nbsp; = &lt;/span&gt;&lt;/span&gt;&lt;b&gt;픽업대&lt;/b&gt;&amp;nbsp;= 비동기 함수 속 인자(콜백 함수)의 대기 공간 = Call Stack에 전달될 콜백함수&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-   &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;event Loop&lt;/b&gt; = 카페&amp;nbsp;&lt;/span&gt;&lt;b&gt;매니저&lt;/b&gt; = Task Queue에 콜백 함수를 Call Stack에 전달 = &lt;b&gt;바리스타 괴롭히는 사람&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2025-09-1119.27.55-ezgif.com-video-to-gif-converter.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boaC0e/btsQtIWv2o4/1KymtuX9PWq8Ync5UlJYsK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boaC0e/btsQtIWv2o4/1KymtuX9PWq8Ync5UlJYsK/img.gif&quot; data-alt=&quot;자바스크립트 이벤트 루프 예시 비디오&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boaC0e/btsQtIWv2o4/1KymtuX9PWq8Ync5UlJYsK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/boaC0e/btsQtIWv2o4/1KymtuX9PWq8Ync5UlJYsK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;자바스크립트 이벤트 루프 동작 과정을 시각적으로 보여주는 애니메이션&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;442&quot; data-filename=&quot;2025-09-1119.27.55-ezgif.com-video-to-gif-converter.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자바스크립트 이벤트 루프 예시 비디오&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1.&amp;nbsp; First() 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;First()&lt;/b&gt; 호출 &amp;rarr; 콜스택에 &lt;b&gt;First()&amp;nbsp;&lt;/b&gt;push &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&amp;rarr;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;콜스택에서&amp;nbsp;&lt;b&gt;First()&lt;/b&gt; 실행 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;console.log('1')&lt;/b&gt;&amp;nbsp;호출 &amp;rarr; 콜스택에&amp;nbsp;&lt;b&gt;console.log&amp;nbsp;&lt;/b&gt;push &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&amp;rarr; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;console.log('1')&lt;/b&gt;&amp;nbsp;실행 &amp;rarr; 콘솔에&amp;nbsp;&lt;b&gt;1&lt;/b&gt;&amp;nbsp;출력&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;console.log&lt;/b&gt;&amp;nbsp;실행 완료 &amp;rarr; 콜스택에서&amp;nbsp;&lt;b&gt;console.log&lt;/b&gt;&amp;nbsp;pop&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;First()&amp;nbsp;&lt;/b&gt;실행 완료 &amp;rarr; 콜스택에서&amp;nbsp;First()&amp;nbsp;pop&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2.&amp;nbsp; setTimeout(Second, 5000) 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;setTimeout(Second, 5000)&lt;/b&gt;&amp;nbsp;호출 &amp;rarr; 콜스택에&amp;nbsp;&lt;b&gt;setTimeout&lt;/b&gt;&amp;nbsp;push&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;콜스택에서&amp;nbsp;&lt;b&gt;setTimeout&lt;/b&gt;&amp;nbsp;실행 &amp;rarr; 브라우저(Web API)에&amp;nbsp;&lt;b&gt;&amp;ldquo;5초 뒤에 Second 실행&amp;rdquo;&lt;/b&gt;&amp;nbsp;요청&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Web API는 타이머를 설정&lt;/b&gt;하고,&amp;nbsp;&lt;b&gt;setTimeout&lt;/b&gt;&amp;nbsp;실행 완료 &amp;rarr; 콜스택에서&amp;nbsp;&lt;b&gt;setTimeout&lt;/b&gt;&amp;nbsp;pop&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Web API 영역에서 &lt;b&gt;5초 카운트다운 시작&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.&amp;nbsp; Third() 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Third()&amp;nbsp;&lt;/b&gt;호출 &amp;rarr; 콜스택에&amp;nbsp;&lt;b&gt;Third()&amp;nbsp;&lt;/b&gt;push &amp;rarr; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;콜스택에서&amp;nbsp;&lt;b&gt;Third()&lt;/b&gt; 실행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;console.log('3')&lt;/b&gt;&amp;nbsp;호출 &amp;rarr; 콜스택에&amp;nbsp;&lt;b&gt;console.log&lt;/b&gt; push &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;console.log('3')&amp;nbsp;&lt;/b&gt;실행 &amp;rarr; 콘솔에&amp;nbsp;&lt;b&gt;3&lt;/b&gt;&amp;nbsp;출력&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;console.log&lt;/b&gt;&amp;nbsp;실행 완료 &amp;rarr; 콜스택에서&amp;nbsp;&lt;b&gt;console.log&lt;/b&gt;&amp;nbsp;pop&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Third()&amp;nbsp;&lt;/b&gt;실행 완료 &amp;rarr; 콜스택에서&amp;nbsp;&lt;b&gt;Third()&amp;nbsp;&lt;/b&gt;pop&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. &amp;nbsp;5초 후 (Web API &amp;rarr; Task Queue 이동)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Web API의 타이머 종료 &amp;rarr;&amp;nbsp;&lt;b&gt;Second&lt;/b&gt; 함수(콜백)를 &lt;b&gt;태스크 큐(Task Queue)&lt;/b&gt;에 넣음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;콜스택이 비어 있을 때까지 대기&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5.&amp;nbsp; 이벤트 루프(Event Loop), &lt;b&gt;Second&lt;/b&gt;&lt;b&gt;() 실행&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이벤트 루프 콜스택 비어 있음 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;태스크 큐에서&amp;nbsp;&lt;b&gt;Second&lt;/b&gt; 함수 꺼내 &amp;rarr; 콜스택에 push &amp;nbsp;&amp;rarr; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;콜스택에서&amp;nbsp;&lt;b&gt;Second()&amp;nbsp;&lt;/b&gt;실행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내부 &lt;b&gt;console.log('2')&lt;/b&gt;&amp;nbsp;호출 &amp;rarr; 콜스택에&amp;nbsp;&lt;b&gt;console.log&lt;/b&gt; push &amp;nbsp;&amp;rarr; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;console.log('2')&lt;/b&gt;&amp;nbsp;실행 &amp;rarr; 콘솔에&amp;nbsp;&lt;b&gt;2&lt;/b&gt;&amp;nbsp;출력&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;console.log&amp;nbsp;&lt;/b&gt;실행 완료 &amp;rarr; 콜스택에서&amp;nbsp;&lt;b&gt;console.log&lt;/b&gt;&amp;nbsp;pop&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Second()&lt;/b&gt;&amp;nbsp;실행 완료 &amp;rarr; 콜스택에서&amp;nbsp;&lt;b&gt;Second()&lt;/b&gt;&amp;nbsp;pop&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;margin: 15px 0; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;!-- 디스플레이 광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-9910939065024756&quot; data-ad-slot=&quot;1784286195&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/span&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; ️ 개발 시 고려할 점&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;콜스택(Call Stack)을 바쁘게 하지 말자&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;콜스택에서 &lt;/span&gt;오래 걸리는 작업(예: 무한 루프, 복잡한 계산, 대량의 DOM 조작 등)이 쌓이면 &amp;rarr; &lt;b&gt;다른 이벤트가 처리되지 못합니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &amp;nbsp;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;긴 작업은 잘게 나누어 처리하거나(setTimeout, requestIdleCallback, Web Worker 사용), 메인 스레드를 막지 않도록 분리해 보세요!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;태스크 큐(Task Queue)를 바쁘게 하지 말자&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;태스크 큐는 &lt;b&gt;완료된 비동기 작업(콜백 함수)이 줄 서는 공간&lt;/b&gt;입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;너무 많은 setTimeout, setInterval, 이벤트 핸들러가 동시에 쌓이면 큐가 과부하될 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;그러면 실행이 지연되고, UI 반응이 늦어져서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;사용자가 느끼기에 '버벅거린다'는 느낌을 줍니다&lt;/span&gt;.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;불필요한 이벤트 리스너 남발을 피하고, 이벤트 최적화(debounce, throttle) 기법을 활용해 보세요!&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  &lt;/b&gt;&lt;b&gt;마무리&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;잘 이해가 되셨나요..? 워낙 방대한 개념이라 Micro task Queue, Promise 등은 다루지 않았고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일부 개념들은 간단하게 설명하고 넘어간 부분들이 있기에 걱정은 되지만 이 글을 통해서 JS 동작 흐름을 잡는데 도움이 되었으면 좋겠네요!&lt;/span&gt;&lt;/p&gt;</description>
      <category>간단하고 쉽게/JavaScript</category>
      <category>Call Back Queue</category>
      <category>call stack</category>
      <category>event loop</category>
      <category>Front Web</category>
      <category>JavaScript event loop</category>
      <category>js 동작원리</category>
      <category>JS 엔진</category>
      <category>Tast Queue</category>
      <category>웹개발</category>
      <category>자바스크립트 동작 원리</category>
      <author>꼼코더</author>
      <guid isPermaLink="true">https://ccomccomhan.tistory.com/300</guid>
      <comments>https://ccomccomhan.tistory.com/300#entry300comment</comments>
      <pubDate>Thu, 11 Sep 2025 20:43:39 +0900</pubDate>
    </item>
    <item>
      <title>[개발 관련 도움] - 코드 스니펫(Code Snippet)이란? - 간단하고 쉽게 알아보기(나만의 코드 스니펫 만들기, VS code 스니펫 설정)</title>
      <link>https://ccomccomhan.tistory.com/299</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;  순서 소개&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코드 스니펫을 간단하게 알아보고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제로 Mac VS code에 코드 스니핏을 만들어 보도록 하겠다!&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  코드 스니펫이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍에서 &lt;b&gt;자주 사용되는 코드의 작은 조각을 의미&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;따라서 코드 스니핏 템플릿을 설정하게 된다면&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;'자주 사용하는 코드를 반복해서 타이핑 하는 불편함을 없애준다'.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;팀 내 코드 스타일, 사용 패턴을 통일할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt; &amp;zwj;♂️ &lt;/b&gt;코드 스니펫 템플릿 필요성&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개발자 A&lt;/b&gt; : &amp;ldquo;함수 선언마다 &amp;nbsp;&lt;b&gt;'const, function, () &amp;rArr; {}'&lt;/b&gt;들을 &lt;b&gt;매번 입력하기 귀찮아!&lt;span style=&quot;background-color: #f6e199;&quot;&gt; 이 모든걸 쉽게 딸깍하면 짜잔하고 나타났으면 좋겠어&lt;/span&gt;&lt;/b&gt;!!&amp;rdquo; &amp;rArr; 그걸 해결해 주기 위한 것이 &amp;lsquo;코드 스니핏&amp;rsquo;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;&lt;b&gt;코드 스니펫 템플릿 &lt;/b&gt;&lt;/b&gt;&lt;b&gt;사용 흐름&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;순서 : 1. 코드의 스니핏 &amp;lsquo;단축어&amp;rsquo;를 정의 &amp;gt; 2.정의한 단축어를 입력 &amp;gt; 3.자주 사용하는 작은 코드가 즉시 작성&amp;rsquo;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시 1) 딸깍 &amp;rArr; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;useEffect 기본 작성 틀 자동완성(&lt;/b&gt;&lt;/span&gt;의존성 배열, 콜백 함수 등..)&lt;/li&gt;
&lt;li&gt;예시 2) 딸깍 &amp;rArr; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Component 기본 작성 틀 자동완성&lt;/b&gt;&lt;/span&gt; (function, return, export 등..)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 &amp;lsquo;요리&amp;rsquo;로 비유하자면 : 요리시작! &amp;rarr; 딸깍! &amp;rarr; &amp;lsquo;양파 다지기&amp;rsquo; 끝! (&amp;hellip; &amp;zwj;♂️)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;코드 스니펫의 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 간단한 기본 구조만 알아 보자 (&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;&lt;b&gt;실습 및 예재 코드가&lt;/b&gt; &lt;b&gt;급하다면 아래로 넘어가자&lt;/b&gt;!&lt;/u&gt;&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JSON&lt;/b&gt; 또는 &lt;b&gt;XML&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_1753839584504&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;스니핏 이름&quot;: {
    &quot;prefix&quot;: &quot;단축어&quot;,
    &quot;body&quot;: [
      &quot;스니핏에 삽입될 코드&quot;,
      &quot;필요하면 여러 줄을 포함할 수 있습니다.&quot;
    ],
    &quot;description&quot;: &quot;스니핏에 대한 설명 (선택 사항)&quot;
  }
}&lt;/code&gt;&lt;/pre&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;/li&gt;
&lt;li&gt;&lt;b&gt;prefix (단축어)&lt;/b&gt;: 스니핏을 호출할 때 사용할 &lt;b&gt;단축어&lt;/b&gt;. (이 값을 통해 body의 값을 불러온다!)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;body (코드 본문)&lt;/b&gt;: 실제로 삽입될 &lt;b&gt;코드 내용&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;description (설명)&lt;/b&gt;: 스니핏에 대한 짧은 &lt;b&gt;설명&lt;/b&gt;으로. (선택사항)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;margin: 15px 0; text-align: center;&quot;&gt;&lt;!-- 디스플레이 광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-9910939065024756&quot; data-ad-slot=&quot;1784286195&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; &amp;zwj;  실습) VS Code에서 코드 스니펫 템플릿 작성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 본인은 &lt;b&gt;TypeScript를 사용한 React 컴포넌트 생성 코드 스니핏을 작성&lt;/b&gt;해 보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(다른 언어를 사용하여도 똑같이 진행하면 된다!)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;(좌측 상단) Code &amp;rarr; 설정 &amp;rarr; 코드 조각 구성 클릭&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-25 오전 11.18.33.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lP0Gu/btsPB3tpMYw/5CJykfFk3r8Z1Jf5JvItCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lP0Gu/btsPB3tpMYw/5CJykfFk3r8Z1Jf5JvItCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lP0Gu/btsPB3tpMYw/5CJykfFk3r8Z1Jf5JvItCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlP0Gu%2FbtsPB3tpMYw%2F5CJykfFk3r8Z1Jf5JvItCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;VS Code 코드 조각 구성 메뉴 화면&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;331&quot; data-filename=&quot;스크린샷 2024-09-25 오전 11.18.33.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 원하는 언어의 &amp;lsquo;코드 조각 파일&amp;rsquo;을 선택한다.(typesciptreact.json)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원하는 언어가 없다면 새 코드 조각을 만들어도 좋다!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-26 오후 9.23.57.png&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ldrTb/btsPCJnL2vF/AnWJMlmL1OHu2KI80FkPX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ldrTb/btsPCJnL2vF/AnWJMlmL1OHu2KI80FkPX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ldrTb/btsPCJnL2vF/AnWJMlmL1OHu2KI80FkPX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FldrTb%2FbtsPCJnL2vF%2FAnWJMlmL1OHu2KI80FkPX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;VS Code 코드 스니핏 언어 선택 화면&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;523&quot; data-filename=&quot;스크린샷 2024-09-26 오후 9.23.57.png&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &amp;lsquo;기본 템플릿&amp;rsquo;이 나온다면 수정으로 진행하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-26 오후 9.25.33.png&quot; data-origin-width=&quot;2786&quot; data-origin-height=&quot;1974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQRmss/btsPErzoUPO/kf9bVHJo84INhlfeKgbYc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQRmss/btsPErzoUPO/kf9bVHJo84INhlfeKgbYc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQRmss/btsPErzoUPO/kf9bVHJo84INhlfeKgbYc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQRmss%2FbtsPErzoUPO%2Fkf9bVHJo84INhlfeKgbYc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;VS Code 코드 스니핏 기본 템플릿 화면&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;447&quot; data-filename=&quot;스크린샷 2024-09-26 오후 9.25.33.png&quot; data-origin-width=&quot;2786&quot; data-origin-height=&quot;1974&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 아래와 같이 &amp;ldquo;TypeScript 기반의 컴포넌트를 작성할 때 사용할 기본 코드 스니핏을 정의해 보았다&amp;rdquo;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;prefix (단축어)는 &amp;lsquo;fsf&amp;rsquo;로 지정해 주었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-26 오후 9.12.13.png&quot; data-origin-width=&quot;2482&quot; data-origin-height=&quot;1676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGrSER/btsPDrmvQzo/fAOwhds1eWeVdA00BDAF8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGrSER/btsPDrmvQzo/fAOwhds1eWeVdA00BDAF8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGrSER/btsPDrmvQzo/fAOwhds1eWeVdA00BDAF8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGrSER%2FbtsPDrmvQzo%2FfAOwhds1eWeVdA00BDAF8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;React 컴포넌트 코드 스니핏 정의 JSON 화면&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;467&quot; data-filename=&quot;스크린샷 2024-09-26 오후 9.12.13.png&quot; data-origin-width=&quot;2482&quot; data-origin-height=&quot;1676&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;pre id=&quot;code_1753840995284&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;Flow Component Template&quot;: {
    &quot;prefix&quot;: &quot;fsf&quot;,
    &quot;body&quot;: [
	&quot;import React from 'react';&quot;,
	&quot;&quot;,
      &quot;type ${TM_FILENAME_BASE}Props = {&quot;,
      &quot;  $1&quot;, // 첫 번째 커서 위치: props를 정의할 곳
      &quot;};&quot;,
      &quot;&quot;,
      &quot;export default function ${TM_FILENAME_BASE}(props: ${TM_FILENAME_BASE}Props) {&quot;,
      &quot;  const { } = props;&quot;,
      &quot;&quot;,
      &quot;  return (&quot;,
      &quot;    &amp;lt;div&amp;gt;&quot;,
      &quot;      $0&quot;, // 마지막 커서 위치: div 내부에 커서가 위치
      &quot;    &amp;lt;/div&amp;gt;&quot;,
      &quot;  );&quot;,
      &quot;};&quot;
    ],
    &quot;description&quot;: &quot;Flow component template with filename as the component name&quot;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. tsx 파일 생성 후 &amp;rArr; 지정한 단축어 &amp;lsquo;fsf&amp;rsquo;를 입력하면 정의한 &amp;lsquo;코드 스니핏&amp;rsquo;이 자동완성으로 나타난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-26 오후 9.13.20.png&quot; data-origin-width=&quot;2482&quot; data-origin-height=&quot;1676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/luFVo/btsPBoSljXc/VHv5GBiSK5XUCHvDogQ4hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/luFVo/btsPBoSljXc/VHv5GBiSK5XUCHvDogQ4hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/luFVo/btsPBoSljXc/VHv5GBiSK5XUCHvDogQ4hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FluFVo%2FbtsPBoSljXc%2FVHv5GBiSK5XUCHvDogQ4hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;VS Code 자동완성 스니핏 제안 화면&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;430&quot; data-filename=&quot;스크린샷 2024-09-26 오후 9.13.20.png&quot; data-origin-width=&quot;2482&quot; data-origin-height=&quot;1676&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;6. enter를 통하여 정의한 스니핏이 작성된 것을 볼 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때 마우스 커서의 위치까지 정의하였기에 type지정 &amp;rArr; jsx 문법까지 순차적으로 편리하게 진행이 가능하다!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btKmbQ/btsPCKGX43d/EOGmFxKyVWqdyHydWSNpu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btKmbQ/btsPCKGX43d/EOGmFxKyVWqdyHydWSNpu0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1618&quot; data-filename=&quot;스크린샷 2024-09-26 오후 9.14.37.png&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btKmbQ/btsPCKGX43d/EOGmFxKyVWqdyHydWSNpu0/img.png&quot; alt=&quot;스니핏 적용 후 타입 지정 단계 화면&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtKmbQ%2FbtsPCKGX43d%2FEOGmFxKyVWqdyHydWSNpu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2130&quot; height=&quot;1618&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceo941/btsPCojJq9t/ksr7gV6WzSlQY30kRO7KSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceo941/btsPCojJq9t/ksr7gV6WzSlQY30kRO7KSK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1618&quot; data-filename=&quot;스크린샷 2024-09-26 오후 9.17.44.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceo941/btsPCojJq9t/ksr7gV6WzSlQY30kRO7KSK/img.png&quot; alt=&quot;스니핏 적용 후 JSX 작성 단계 화면&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fceo941%2FbtsPCojJq9t%2Fksr7gV6WzSlQY30kRO7KSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2130&quot; height=&quot;1618&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;✋  마무리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 내 코드 컨벤션에 따라 [type, interface], [함수 선언식, 함수 표현식] 등을 잘 구분하여 정의해 보자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 예시처럼 꼭 컴포넌트 스니핏 정의가 아니더라도&lt;b&gt; 자주 사용하는 패턴이 있다면 정의해서 편리하게 개발해 보면 좋겠다&lt;/b&gt;!&lt;/p&gt;</description>
      <category>개발 관련 도움</category>
      <category>snippet</category>
      <category>vscode단축어</category>
      <category>vs코드스니핏</category>
      <category>개발단축어</category>
      <category>개발단축키</category>
      <category>개발편의성</category>
      <category>스니펫</category>
      <category>코드스니펫</category>
      <category>코드컨벤션</category>
      <author>꼼코더</author>
      <guid isPermaLink="true">https://ccomccomhan.tistory.com/299</guid>
      <comments>https://ccomccomhan.tistory.com/299#entry299comment</comments>
      <pubDate>Wed, 30 Jul 2025 11:07:12 +0900</pubDate>
    </item>
    <item>
      <title>[ERROR] - This key is not known by any other names해결 (GitLab SSH 연결 오류 해결방법, SSH 접속, SSH Key 등록)</title>
      <link>https://ccomccomhan.tistory.com/298</link>
      <description>&lt;h2 id=&quot;block-deaa08d3df744b5cb9212b5f1261b5eb&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;Error 발생(GitLab SSH 연결 오류)&lt;/h2&gt;
&lt;p id=&quot;block-449a3a0cb8ee41e4829c89601caaeb68&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GitLab에서 프로젝트 clone 도중&lt;b&gt; This key is not known by any other names.&lt;/b&gt;가 확인되었다.&lt;/p&gt;
&lt;p id=&quot;block-adf758be5f5f43498586de226cda5236&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;번역하면 &amp;lsquo;&lt;b&gt;이 키는 다른 이름으로 알려져 있지 않습니다.&lt;/b&gt;&amp;rsquo;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;block-291448b1d80947e2951cbf42a3f6d350&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쉽게 말해, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;연결할 GitLab에서 사용하는 SSH 키가 사용자 쪽에 연결되어 있지 않음&lt;/b&gt;&lt;/span&gt;을 확인하는 메시지&lt;/p&gt;
&lt;div id=&quot;block-5d94b93455fa4693bafc95aec505c690&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tGoqs/btsJgIg4fnw/2Rm6oaY5yXd4DIlQ91LHgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tGoqs/btsJgIg4fnw/2Rm6oaY5yXd4DIlQ91LHgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tGoqs/btsJgIg4fnw/2Rm6oaY5yXd4DIlQ91LHgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtGoqs%2FbtsJgIg4fnw%2F2Rm6oaY5yXd4DIlQ91LHgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;GitLab 프로젝트 clone 도중 발생한 SSH 연결 오류 메시지 화면&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;191&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p id=&quot;block-8795c04369a640ab85c2a3d41803ee6a&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;Are you sure you want to continue connecting (yes/no/[fingerprint])?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;block-a9cfe43e821e4ad4b5a6e6d58647803d&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 당신은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;이 서버가 신뢰할 수 있는 서버라 믿고 연결을 계속할 건가?&lt;/b&gt;&lt;/span&gt; / yes를 눌렀지만 오류가 나왔다&amp;hellip;&lt;/p&gt;
&lt;div id=&quot;block-6e446dcda5e64d4b895571308d14c3c5&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CLJcc/btsJgfGpIjV/Dt7Dg8qbcXJyGClttbgAN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CLJcc/btsJgfGpIjV/Dt7Dg8qbcXJyGClttbgAN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CLJcc/btsJgfGpIjV/Dt7Dg8qbcXJyGClttbgAN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCLJcc%2FbtsJgfGpIjV%2FDt7Dg8qbcXJyGClttbgAN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;SSH 연결 시 Are you sure you want to continue connecting 메시지가 표시된 터미널 화면&quot; loading=&quot;lazy&quot; width=&quot;624&quot; height=&quot;100.69841&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h3 id=&quot;block-6c16745df2854497b0ba396cf13064fb&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &amp;nbsp;&quot;yes&quot;를 입력하면 어떻게 되는가&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li id=&quot;block-8c073747ffb84169958f09a8ad2481d0&quot;&gt;&lt;b&gt;'yes'를 입력&lt;/b&gt;하면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;해당 서버의 SSH 키가 로컬 머신에 저장&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li id=&quot;block-331bb4039d3d4e4caa8cc72fd8b59b5c&quot;&gt;이후부터 동일한 GitLab 서버에 연결할 때 더 이상 이 경고 메시지를 보지 않게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;margin: 15px 0; text-align: center;&quot;&gt;&lt;!-- 디스플레이 광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-9910939065024756&quot; data-ad-slot=&quot;1784286195&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/div&gt;
&lt;h2 id=&quot;block-b6b22dddc8ad4038982c95100dc4740a&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;✅&amp;nbsp;해결책 - SSH key Gen 등록&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 터미널 프로그램 열기 (CMD, items, 터미널 등&amp;hellip;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-08-26 오후 4.44.42.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ofiqY/btsJhEZixKE/KZVhqFpcROLKnFKMQX5IBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ofiqY/btsJhEZixKE/KZVhqFpcROLKnFKMQX5IBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ofiqY/btsJhEZixKE/KZVhqFpcROLKnFKMQX5IBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FofiqY%2FbtsJhEZixKE%2FKZVhqFpcROLKnFKMQX5IBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;터미널에서 SSH 키 생성을 준비하는 기본 화면&quot; loading=&quot;lazy&quot; width=&quot;453&quot; height=&quot;359&quot; data-filename=&quot;스크린샷 2024-08-26 오후 4.44.42.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. SSH key 생성 명령어 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&amp;lsquo;ssh-keygen&amp;rsquo;를 입력&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때 key - value 형식으로 생성된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1724681180276&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ssh-keygen&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;3. Enter 키 입력 (기본 경로로 key 저장) &amp;rarr; 다른 경로나 파일 이름을 지정하고 싶다면, 경로를 입력.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot;&gt;이때 저장한 &lt;/span&gt;&lt;span style=&quot;background-color: #fbecdd;&quot; data-token-index=&quot;1&quot;&gt;id_???.pub 파일은 SSH로 등록할 파일이기에 공유하면 안 되는 중요한 파일&lt;/span&gt;&lt;span data-token-index=&quot;2&quot;&gt;이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div id=&quot;block-841e7ab8a2fb4478986037833604ce1d&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1015&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMOVy4/btsJg4xqyGC/UJp1H0qg5zFQTX71agYK31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMOVy4/btsJg4xqyGC/UJp1H0qg5zFQTX71agYK31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMOVy4/btsJg4xqyGC/UJp1H0qg5zFQTX71agYK31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMOVy4%2FbtsJg4xqyGC%2FUJp1H0qg5zFQTX71agYK31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;터미널에서 ssh-keygen 명령어로 SSH 키를 생성하는 과정&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;371&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1015&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;b&gt;'Enter passphrase (empty for no passphrase)'&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SSH &lt;b&gt;키를 생성할 때&lt;/b&gt;, 키 파일에 추가적인 보안을 위해 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;비밀번호를 설정할지 묻는 단계&lt;/b&gt;&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;비밀번호 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;설정하지 않는다면 &amp;rArr; enter&lt;/b&gt;&lt;/span&gt; (&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;만약 본인 컴퓨터가 안전하고 SSH Key 도난 우려가 없다면)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;설정하고 싶다면 &amp;rArr; 비밀번호 입력&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0LCPY/btsJhkzRGR1/qEbsdt0VPmulft0CTnKhD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0LCPY/btsJhkzRGR1/qEbsdt0VPmulft0CTnKhD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0LCPY/btsJhkzRGR1/qEbsdt0VPmulft0CTnKhD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0LCPY%2FbtsJhkzRGR1%2FqEbsdt0VPmulft0CTnKhD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;SSH 키 생성 중 Enter passphrase 입력을 요청하는 메시지 화면&quot; loading=&quot;lazy&quot; width=&quot;318&quot; height=&quot;49&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;49&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;5. SSH 키 쌍이&lt;b&gt; 성공적으로 생성&lt;/b&gt;하게되면 &lt;b&gt;아래와 같은 형식의 성공 메시지를 확인&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/didw4W/btsJgdojaeq/3iwZNvRQFQO7bL1ZRdTY7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/didw4W/btsJgdojaeq/3iwZNvRQFQO7bL1ZRdTY7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/didw4W/btsJgdojaeq/3iwZNvRQFQO7bL1ZRdTY7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdidw4W%2FbtsJgdojaeq%2F3iwZNvRQFQO7bL1ZRdTY7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;SSH 키가 성공적으로 생성되었음을 알리는 터미널 메시지 화면&quot; loading=&quot;lazy&quot; width=&quot;491&quot; height=&quot;389&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. &lt;b&gt;cd ~/.ssh 명령어 입력&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1724681627109&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd ~/.ssh&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;7. &lt;b&gt;ls -al 명령어 입력&lt;/b&gt; &amp;rArr; 생성한 .pub 파일 확인&lt;/p&gt;
&lt;pre id=&quot;code_1724681636508&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ls -al&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tuG82/btsJhCApyIC/qk8fBKHC1QwNA5rbZWOxA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tuG82/btsJhCApyIC/qk8fBKHC1QwNA5rbZWOxA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tuG82/btsJhCApyIC/qk8fBKHC1QwNA5rbZWOxA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtuG82%2FbtsJhCApyIC%2Fqk8fBKHC1QwNA5rbZWOxA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;터미널에서 ls -al 명령어로 SSH 키 파일 목록을 확인하는 화면&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;209&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;205&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;8. cat id_???.pub 명령어 입력 후 &amp;rarr; &lt;span style=&quot;background-color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;출력된&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;SSH key &lt;/b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;내용 복사&lt;/b&gt; ([ssh- ~ ..local 까지)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1724681843424&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## 이전에 생성한 .pub 파일명 (???에 생성된 이름과 동일하게 맞추기)
cat id_????.pub&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zCNLu/dJMcafrOeLl/XOSV5FtKuoLrXnjjKgffc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zCNLu/dJMcafrOeLl/XOSV5FtKuoLrXnjjKgffc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zCNLu/dJMcafrOeLl/XOSV5FtKuoLrXnjjKgffc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzCNLu%2FdJMcafrOeLl%2FXOSV5FtKuoLrXnjjKgffc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;cat id_rsa.pub 명령어 실행 후 공개키 내용이 출력된 터미널 화면&quot; loading=&quot;lazy&quot; width=&quot;511&quot; height=&quot;586&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;586&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;9. &lt;b&gt;Git Lab 서버의 SSH 등록 페이지로 이동&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;방법 1&lt;/b&gt; : 접속하려고 하는 Git Lab 프로젝트 상단 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;[Add SSH Key] 버튼 클릭&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQAWV1/btsJfnZv8Dl/WiOK400c46SLDucCKhlqek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQAWV1/btsJfnZv8Dl/WiOK400c46SLDucCKhlqek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQAWV1/btsJfnZv8Dl/WiOK400c46SLDucCKhlqek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQAWV1%2FbtsJfnZv8Dl%2FWiOK400c46SLDucCKhlqek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;GitLab 프로젝트 화면 상단 Add SSH Key 버튼 위치&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;86&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;방법 2&lt;/b&gt; : Git Lab 좌측 메뉴 &amp;rarr; profile &amp;rarr; Edit profile &amp;rarr; SSH keys&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lIKsX/btsJfAElOig/HOk1qqLyTwmoVx5f8PPJz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lIKsX/btsJfAElOig/HOk1qqLyTwmoVx5f8PPJz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lIKsX/btsJfAElOig/HOk1qqLyTwmoVx5f8PPJz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlIKsX%2FbtsJfAElOig%2FHOk1qqLyTwmoVx5f8PPJz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;GitLab 프로필 설정에서 SSH Keys 메뉴 화면&quot; loading=&quot;lazy&quot; width=&quot;227&quot; height=&quot;270&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;620&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;10. 우측 상단&lt;b&gt; &lt;/b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;[Add new key] 버튼 클릭&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;block-3c9e6d29f64b4ee1b60daae1f5e897b8&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pGM6Z/btsJfCoBbBc/k17OeAXFKdCFK4Uzeeg5wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pGM6Z/btsJfCoBbBc/k17OeAXFKdCFK4Uzeeg5wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pGM6Z/btsJfCoBbBc/k17OeAXFKdCFK4Uzeeg5wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpGM6Z%2FbtsJfCoBbBc%2Fk17OeAXFKdCFK4Uzeeg5wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;GitLab에서 Add new key 버튼 클릭 후 SSH 키를 입력하는 화면&quot; loading=&quot;lazy&quot; width=&quot;511&quot; height=&quot;333&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;833&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. SSH key 정보 입력 후 &amp;rarr; &lt;b&gt;[Add key] 버튼을 클릭&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;key&lt;/b&gt; : 이전에 복사한 SSH key 값&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Title&lt;/b&gt; : 자유롭게 작성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Expiration date&lt;/b&gt; : 유효 기간 설정 (선택하지 않을 시 무기한)&lt;/li&gt;
&lt;/ul&gt;
&lt;div id=&quot;block-ba2269e7dea64bdc9cd4e6926354e20d&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLDiFx/btsJgAp1whZ/XHuqw3R0mLFJoI82yMknyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLDiFx/btsJgAp1whZ/XHuqw3R0mLFJoI82yMknyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLDiFx/btsJgAp1whZ/XHuqw3R0mLFJoI82yMknyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLDiFx%2FbtsJgAp1whZ%2FXHuqw3R0mLFJoI82yMknyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;GitLab에 SSH Key가 등록 완료된 화면&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;381&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;833&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12.&lt;b&gt; Git Lab 주소 복사&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFWLE5/btsJe5LD1zL/9u4HjhlCWObebAUtzo76lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFWLE5/btsJe5LD1zL/9u4HjhlCWObebAUtzo76lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFWLE5/btsJe5LD1zL/9u4HjhlCWObebAUtzo76lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFWLE5%2FbtsJe5LD1zL%2F9u4HjhlCWObebAUtzo76lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;435&quot; data-filename=&quot;Untitled.png&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;809&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;13. &lt;b&gt;복사한 URL로 git clone 명령어 입력&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1724682070423&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone &amp;lsquo;복사한 URL&amp;rsquo;&lt;/code&gt;&lt;/pre&gt;
&lt;div id=&quot;block-5f206bd7bcec4e3882ec5526de1ce94d&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id=&quot;block-920ae8c2a28d4de1b3f50d9f3d68f027&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buJE6B/btsJfTDBjAB/lPDm2LXKyxOHdK6AmQQwRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buJE6B/btsJfTDBjAB/lPDm2LXKyxOHdK6AmQQwRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buJE6B/btsJfTDBjAB/lPDm2LXKyxOHdK6AmQQwRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuJE6B%2FbtsJfTDBjAB%2FlPDm2LXKyxOHdK6AmQQwRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;터미널에서 git clone 명령어 실행 후 정상적으로 프로젝트가 복제된 화면&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;307&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;block-2bd1ba71818b49419d4f44004050f84f&quot; style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이전과 달리 정상적으로 clone에 성공한 것을 볼 수 있다.  &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고 1 :&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #333333;&quot;&gt;&lt;a style=&quot;background-color: #ffffff; color: #333333;&quot; href=&quot;https://unwritten.tistory.com/91&quot;&gt;https://unwritten.tistory.com/91&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;참고 2 : &lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://git-scm.com/book/ko/v2/Git-서버-SSH-공개키-만들기&quot;&gt;https://git-scm.com/book/ko/v2/Git-서버-SSH-공개키-만들기&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>ERROR</category>
      <category>GitLab</category>
      <category>gitlab ssh 연결</category>
      <category>ssh</category>
      <category>ssh key 등록</category>
      <category>ssh key 에러</category>
      <category>SSH 에러</category>
      <category>ssh 에러 해결</category>
      <category>ssh 연결오류</category>
      <category>SSH 오류</category>
      <category>에러</category>
      <author>꼼코더</author>
      <guid isPermaLink="true">https://ccomccomhan.tistory.com/298</guid>
      <comments>https://ccomccomhan.tistory.com/298#entry298comment</comments>
      <pubDate>Mon, 26 Aug 2024 23:26:06 +0900</pubDate>
    </item>
  </channel>
</rss>