<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>javascript on 오늘도 개발을 한다.</title>
    <link>https://cloudsoswift.github.io/post/develop/javascript/</link>
    <description>오늘도 개발을 한다. (javascript)</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ko-kr</language>
    
    <atom:link href="https://cloudsoswift.github.io/post/develop/javascript/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>[Webpack/Vite 파헤치기] 2. Create React App 내부의 의존성과 환경 설정  꺼내기</title>
      <link>https://cloudsoswift.github.io/post/develop/javascript/bundler/webpack-and-babel-config/</link>
      <pubDate>Sat, 01 Nov 2025 18:16:27 +0900</pubDate>
      
      <guid>https://cloudsoswift.github.io/post/develop/javascript/bundler/webpack-and-babel-config/</guid>
      <description>&lt;h1 id=&#34;서론&#34; &gt;서론
&lt;span&gt;
    &lt;a href=&#34;#%ec%84%9c%eb%a1%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;앞선 게시물에 이어, &lt;code&gt;CRA&lt;/code&gt; 기반의 React App과 &lt;code&gt;Vite&lt;/code&gt; 기반의 React App 비교를 위해 먼저 &lt;code&gt;CRA&lt;/code&gt; 기반의 React App의 구조 및 내포하고 있는 설정들의 파악이 필요하다고 판단했습니다.&lt;br&gt;
따라서 React App을 &lt;code&gt;eject&lt;/code&gt;하여, 내포하고 있던 다양한 dependencies와 config들을 분석하는 시간을 먼저 갖고자 했습니다.&lt;br&gt;
따라서 이번 포스트에서는 React App을 &lt;code&gt;eject&lt;/code&gt; 했을 때 드러나는 의존성 및 설정들의 역할과, 최종적으로 그 구조를 도식화하여 살펴볼 예정입니다.&lt;/p&gt;
&lt;h2 id=&#34;cra-eject시-드러나는-의존성들&#34; &gt;CRA eject시 드러나는 의존성들
&lt;span&gt;
    &lt;a href=&#34;#cra-eject%ec%8b%9c-%eb%93%9c%eb%9f%ac%eb%82%98%eb%8a%94-%ec%9d%98%ec%a1%b4%ec%84%b1%eb%93%a4&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;CRA로 생성한 React App을 &lt;code&gt;react-scripts eject&lt;/code&gt; 명령어를 통해 숨겨진 설정들과 의존성들을 &lt;code&gt;꺼내면(eject)&lt;/code&gt; 다음과 같은 의존성들이 추가됨.&lt;/li&gt;
&lt;li&gt;크게 요약하면 &lt;strong&gt;&lt;code&gt;Babel&lt;/code&gt; 관련 종속성&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;Webpack&lt;/code&gt; 관련 종속성&lt;/strong&gt;(&lt;code&gt;Webpack Loader&lt;/code&gt;), &lt;strong&gt;&lt;code&gt;CSS/SASS&lt;/code&gt; 관련 종속성&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;ESLint&lt;/code&gt; 관련 종속성&lt;/strong&gt;, &lt;strong&gt;테스트 관련 종속성&lt;/strong&gt;, &lt;strong&gt;기타 유틸&lt;/strong&gt; 로 이뤄져 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;babel-관련&#34; &gt;Babel 관련
&lt;span&gt;
    &lt;a href=&#34;#babel-%ea%b4%80%eb%a0%a8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;h4 id=&#34;babel이란&#34; &gt;Babel이란?
&lt;span&gt;
    &lt;a href=&#34;#babel%ec%9d%b4%eb%9e%80&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ES6 이상의 코드&lt;/code&gt;를 이전 환경에 호환되도록 변환하거나, &lt;code&gt;타입스크립트&lt;/code&gt;, &lt;code&gt;React jsx&lt;/code&gt; 등 다른 문법의 코드를 변환해주는 툴체인&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;관련-종속성&#34; &gt;관련 종속성
&lt;span&gt;
    &lt;a href=&#34;#%ea%b4%80%eb%a0%a8-%ec%a2%85%ec%86%8d%ec%84%b1&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/@babel/core&#34;&gt;@babel/core&lt;/a&gt; : Babel 컴파일러의 코어&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/babel-plugin-named-asset-import&#34;&gt;babel-plugin-named-asset-import&lt;/a&gt; : &lt;code&gt;Babel plugin&lt;/code&gt; for &lt;code&gt;named asset imports&lt;/code&gt; in Create React App
&lt;ul&gt;
&lt;li&gt;JS/CSS를 제외한 &lt;code&gt;정적 자원&lt;/code&gt;들을 &lt;code&gt;Named Import&lt;/code&gt; 형태로 가져올 수 있도록하는 플러그인
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Named Import&lt;/code&gt;: default export가 아닌, &lt;code&gt;named Export&lt;/code&gt;된 요소들을 불러오기 위한 import (ex. &lt;code&gt;import { funcA } from &#39;A.js&#39;;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/babel-preset-react-app&#34;&gt;babel-preset-react-app&lt;/a&gt; : &lt;a href=&#34;https://github.com/facebook/create-react-app/tree/main/packages/babel-preset-react-app&#34;&gt;CRA에서 사용된 Babel 프리셋&lt;/a&gt;으로, 해당 프리셋 패키지안에 있는 &lt;a href=&#34;https://github.com/facebook/create-react-app/blob/main/packages/babel-preset-react-app/create.js&#34;&gt;create.js&lt;/a&gt;에 설정된 &lt;code&gt;환경(개발, 프로덕션) 별 프리셋&lt;/code&gt; 및 &lt;code&gt;플러그인 설정&lt;/code&gt;을 내보냄&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;webpack-관련&#34; &gt;Webpack 관련
&lt;span&gt;
    &lt;a href=&#34;#webpack-%ea%b4%80%eb%a0%a8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;h4 id=&#34;webpack이란&#34; &gt;Webpack이란?
&lt;span&gt;
    &lt;a href=&#34;#webpack%ec%9d%b4%eb%9e%80&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;webpack&lt;/code&gt; : Javascript 기반의 &lt;code&gt;모듈 번들러&lt;/code&gt;로, React App의 여러 모듈들을 의존관계끼리 엮어 하나 이상의 번들 정적 에셋으로 번들링하는 툴&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;관련-종속성-1&#34; &gt;관련 종속성
&lt;span&gt;
    &lt;a href=&#34;#%ea%b4%80%eb%a0%a8-%ec%a2%85%ec%86%8d%ec%84%b1-1&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/webpack-dev-server&#34;&gt;webpack-dev-server&lt;/a&gt;: 웹팩과 함께 사용하는, &lt;code&gt;라이브 리로딩&lt;/code&gt;을 제공하는 &lt;code&gt;개발 서버&lt;/code&gt;로, 내부적으로 &lt;a href=&#34;https://github.com/webpack/webpack-dev-middleware&#34;&gt;webpack-dev-middleware&lt;/a&gt;를 사용해 웹팩 에셋에 빠르게 인-메모리 접근&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/webpack-manifest-plugin&#34;&gt;webpack-manifest-plugin&lt;/a&gt;: &lt;code&gt;에셋 매니페스트&lt;/code&gt;를 생성하기 위한 웹팩 &lt;code&gt;플러그인&lt;/code&gt;으로, 생성된 &lt;code&gt;매니페스트&lt;/code&gt;는 아래와 같이 &lt;code&gt;소스 파일 이름&lt;/code&gt; - &lt;code&gt;대응되는 빌드 output 파일&lt;/code&gt; 간의 매핑들을 포함함 (이를 통해 &lt;em&gt;추후&lt;/em&gt; &lt;code&gt;새롭게 번들링된 파일의 파일명&lt;/code&gt;을 &lt;strong&gt;빠르게 파악&lt;/strong&gt;해 사용 가능)
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dist/batman.js&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dist/batman.1234567890.js&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dist/joker.js&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dist/joker.0987654321.js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/workbox-webpack-plugin&#34;&gt;workbox-webpack-plugin&lt;/a&gt;: &lt;code&gt;PWA(프로그레시브 웹 앱)&lt;/code&gt;을 위한 라이브러리 모음인 &lt;a href=&#34;https://github.com/googlechrome/workbox&#34;&gt;Workbox&lt;/a&gt;의 웹팩용 플러그인으로, &lt;code&gt;서비스 워커 생성(GenerateSW)&lt;/code&gt; 및 &lt;code&gt;사전 캐싱(precache)할 에셋 목록(매니페스트)을 생성해 서비스 워커 파일에 주입(InjectManifest)&lt;/code&gt; 하는 기능을 제공 &lt;a href=&#34;https://developer.chrome.com/docs/workbox/modules/workbox-webpack-plugin&#34;&gt;#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/terser-webpack-plugin&#34;&gt;terser-webpack-plugin&lt;/a&gt;: &lt;em&gt;변수 이름 축소, 공백 및 주석 제거, 미사용 코드 제거 등을 통해 코드를 압축(최소화)하는&lt;/em&gt; &lt;a href=&#34;https://terser.org/&#34;&gt;&lt;code&gt;Terser&lt;/code&gt; &lt;/a&gt;의 웹팩 플러그인
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;minimizer&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// This is only used in production mode
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TerserPlugin&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;terserOptions&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;parse&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;// We want terser to parse ecma 8 code. However, we don&amp;#39;t want it
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;// to apply any minification steps that turns valid ecma 5 code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;// into invalid ecma 5 code. This is why the &amp;#39;compress&amp;#39; and &amp;#39;output&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;// sections only apply transformations that are ecma 5 safe
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;// https://github.com/facebook/create-react-app/pull/4234
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;ecma&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;compress&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;ecma&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;warnings&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// Terser가 uglify-es의 포크이기 때문에, Uglify에서 발생했던
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#39;특정 라이브러리 사용시 비교 연산자 처리 버그&amp;#39;가 있기 때문에
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// 비교 연산자를 압축하는 것을 비활성화 함
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// https://github.com/mishoo/UglifyJS2/issues/2011
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;comparisons&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// 작은 함수들을 인라인 함수로 변환해 함수 오버헤드를 줄이는 옵션으로
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// 값이 2일경우 적절한 인라인 레벨을 Terser가 선택하도록 함
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// 정확히는, inline functions with arguments, 즉 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// 아래 두 가지 버그 이슈때문에 2로 명시
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;// https://github.com/facebook/create-react-app/issues/5250
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;// https://github.com/terser-js/terser/issues/120
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;inline&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;mangle&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// 변수 및 함수 이름 난독화 관련 옵션으로, 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// safari10 이란 Safari 10 브라우저의 버그를 회피하기 위한 설정
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;safari10&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#75715e&#34;&gt;// 개발 툴에서 프로파일링 할 수 있도록, 클래스 이름과 함수 명을 난독화할지 설정하는 변수
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;keep_classnames&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;isEnvProductionProfile&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;keep_fnames&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;isEnvProductionProfile&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;output&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// 압축된 코드의 출력 형태와 관한 옵션
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// 최종적으로 압축된 코드는 ES5 버전 호환성을 지님
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;ecma&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// 모든 주석을 제거하도록 함
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;comments&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		  &lt;span style=&#34;color:#75715e&#34;&gt;// 문자열 및 정규 표현식에 존재하는 유니코드 문자를 ASCII 이스케이프 시퀀스(\uXXXX와 같은 형태. ex) `H` =&amp;gt; `\u0048`)로 변경
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;// 이모티콘 또는 특정 정규 표현식이 default로는 제대로 압축되지 않기 때문
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;// https://github.com/facebook/create-react-app/issues/2488
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;ascii_only&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// This is only used in production mode
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CssMinimizerPlugin&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;eject된 &lt;code&gt;webpack.config.js&lt;/code&gt; 설정에 따르면, &lt;strong&gt;프로덕션 환경&lt;/strong&gt;에서 이러한 &lt;code&gt;코드 압축&lt;/code&gt;이 수행되며 &lt;em&gt;&lt;code&gt;ES8(ECMAScript 2017)&lt;/code&gt; 문법까지 이해하고 파싱하되&lt;/em&gt; &lt;code&gt;코드 압축(compress)&lt;/code&gt; 및 &lt;code&gt;출력(output)&lt;/code&gt;은 &lt;code&gt;ES5&lt;/code&gt; 호환성을 유지하도록 코드를 &lt;code&gt;minimize&lt;/code&gt;하려 함&lt;/li&gt;
&lt;li&gt;이외에도 비교 연산자를 압축하지 않는다거나, 클래스 이름 및 함수 명을 난독화 할지 등을 설정하고 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/css-minimizer-webpack-plugin&#34;&gt;css-minimizer-webpack-plugin&lt;/a&gt;: &lt;a href=&#34;https://cssnano.github.io/cssnano/&#34;&gt;cssnano&lt;/a&gt;를 사용해 &lt;code&gt;CSS 파일들을 최적화 및 최소화&lt;/code&gt;하는 웹팩 플러그인으로, &lt;code&gt;캐싱&lt;/code&gt; 및 &lt;code&gt;병렬 처리&lt;/code&gt;를 지원하는 것이 특징임
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cssnano&lt;/code&gt;란, &lt;code&gt;PostCSS&lt;/code&gt; 생태계 기반의 CSS 압축 툴로 &lt;code&gt;주석/공백/줄 바꿈 제거&lt;/code&gt;, &lt;code&gt;헥스코드 축약&lt;/code&gt;, &lt;code&gt;단위 제거&lt;/code&gt; 등의 압축을 수행&lt;/li&gt;
&lt;li&gt;테스트 해볼 수 있는 사이트: &lt;a href=&#34;https://minify-css.com/&#34;&gt;Minify CSS Online. CSS Minification tool powered by CSSNANO. | Minify CSS Online&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/@pmmmwh/react-refresh-webpack-plugin&#34;&gt;@pmmmwh/react-refresh-webpack-plugin&lt;/a&gt;: &lt;code&gt;React Component&lt;/code&gt;에 대해 &lt;code&gt;핫 리로딩&lt;/code&gt;이라고도 부르는 &lt;code&gt;빠른 새로고침&lt;/code&gt;을 가능하게 해주는 웹팩 플러그인
&lt;ul&gt;
&lt;li&gt;위 패키지는 &lt;code&gt;react-dom&lt;/code&gt;, &lt;code&gt;react-refresh&lt;/code&gt; 등의 패키지에 의존하므로 선행 설치가 필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/case-sensitive-paths-webpack-plugin&#34;&gt;case-sensitive-paths-webpack-plugin&lt;/a&gt; 모든 &lt;code&gt;필수 모듈의 전체 경로&lt;/code&gt;를 &lt;code&gt;디스크 상 실제 경로&lt;/code&gt;와 &lt;strong&gt;정확히 일치하도록 강제&lt;/strong&gt;하는 웹팩 플러그인
&lt;ul&gt;
&lt;li&gt;이를 통해 &lt;code&gt;대소문자에 둔감(case-insensitive)&lt;/code&gt;한 환경(ex. OS X(macOS))의 개발자가 &lt;code&gt;대소문자 구분 규칙&lt;/code&gt;을 지키지 않아 &lt;em&gt;다른 개발자나 빌드 환경에서 충돌이 발생하는 문제&lt;/em&gt;를 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/eslint-webpack-plugin&#34;&gt;eslint-webpack-plugin&lt;/a&gt;: 웹팩 빌드 과정에서 코드의 문제를 발견하고 고치기 위해 &lt;a href=&#34;https://eslint.org/&#34;&gt;&lt;code&gt;ESlint&lt;/code&gt;&lt;/a&gt;를 사용하는 플러그인
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;webpack.config.js&lt;/code&gt;에서는 &lt;code&gt;react-dev-utils/eslintFormatter&lt;/code&gt; 포매터와 &lt;code&gt;eslint-config-react-app/base&lt;/code&gt; 설정을 사용해 린팅&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;로더-httpswebpackjsorgconceptsloaders&#34; &gt;로더 &lt;a href=&#34;https://webpack.js.org/concepts/loaders/&#34;&gt;#&lt;/a&gt;
&lt;span&gt;
    &lt;a href=&#34;#%eb%a1%9c%eb%8d%94-httpswebpackjsorgconceptsloaders&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;h5 id=&#34;로더란&#34; &gt;로더란?
&lt;span&gt;
    &lt;a href=&#34;#%eb%a1%9c%eb%8d%94%eb%9e%80&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;웹팩이 처리할 수 없는 &lt;em&gt;&lt;code&gt;Javascript 파일 이외의 파일들&lt;/code&gt;&lt;/em&gt; 을 변환할 수 있도록 도와주는 라이브러리로, 파일을 &lt;code&gt;import&lt;/code&gt;하거나 로드할 때 &lt;code&gt;사전처리&lt;/code&gt;를 수행할 수 있음
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;로더&lt;/code&gt;는 &lt;strong&gt;&lt;code&gt;체이닝&lt;/code&gt;&lt;/strong&gt; 될 수 있으며, &lt;em&gt;체인의 각 로더&lt;/em&gt;는 각각 (앞선 로더에 의해) &lt;code&gt;처리된 리소스&lt;/code&gt;를 전달 받아 변환을 적용함&lt;/li&gt;
&lt;li&gt;최종적으로, &lt;code&gt;Webpack&lt;/code&gt;은 이러한 &lt;code&gt;체인의 마지막 로더&lt;/code&gt;로 부터 &lt;code&gt;Javascript 파일&lt;/code&gt;을 넘겨 받기를 기대함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;로더는 &lt;code&gt;webpack.config.js&lt;/code&gt;의 &lt;code&gt;module.rules&lt;/code&gt; 배열에서 지정할 수 있으며, 선언된 역순으로 로더가 적용됨
&lt;ul&gt;
&lt;li&gt;예를 들어 &lt;code&gt;module: { rules: [&amp;quot;style-loader&amp;quot;, &amp;quot;css-loader&amp;quot;, &amp;quot;sass-loader&amp;quot;]}&lt;/code&gt; 라고 선언이 되어있다면,  &lt;code&gt;sass-loader&lt;/code&gt; -&amp;gt; &lt;code&gt;css-loader&lt;/code&gt; -&amp;gt; &lt;code&gt;style-loader&lt;/code&gt; 순으로 작업이 이뤄짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;관련-종속성-2&#34; &gt;관련 종속성
&lt;span&gt;
    &lt;a href=&#34;#%ea%b4%80%eb%a0%a8-%ec%a2%85%ec%86%8d%ec%84%b1-2&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.npmjs.com/package/babel-loader&#34;&gt;babel-loader&lt;/a&gt; : 웹팩을 위한 &lt;code&gt;Babel Module 로더&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.jsx&lt;/code&gt;, &lt;code&gt;.ts&lt;/code&gt;, &lt;code&gt;.tsx&lt;/code&gt; 와 같은 파일들에 대해 폴리필, TS 및 React JSX 트랜스파일링 등의 작업을 수행하도록 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.npmjs.com/package/@svgr/webpack&#34;&gt;@svgr/webpack&lt;/a&gt;: &lt;code&gt;SVGR&lt;/code&gt; 을 위한 웹팩 로더&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// SVGR 예시 코드
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Logo&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;assets/logo.svg&amp;#39;&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// SVG 파일을 React Component 처럼 import
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Logo&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;width&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;100&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mx-auto&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SVGR&lt;/code&gt;이란, &lt;code&gt;SVG&lt;/code&gt;를 &lt;code&gt;React Component&lt;/code&gt;로 변환해주는 툴로, &lt;code&gt;React Component&lt;/code&gt;에서 &lt;code&gt;SVG 파일&lt;/code&gt;들을 컴포넌트 쓰듯 import 해 사용할 수 있게 해주는 툴&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.npmjs.com/package/css-loader&#34;&gt;css-loader&lt;/a&gt;:  사용된 &lt;code&gt;CSS&lt;/code&gt;를 &lt;code&gt;문자열&lt;/code&gt;로 변환해주는 로더로, &lt;code&gt;@import&lt;/code&gt;와 &lt;code&gt;url()&lt;/code&gt;을 &lt;code&gt;import&lt;/code&gt; / &lt;code&gt;require()&lt;/code&gt;와 동일하게 &lt;code&gt;해석&lt;/code&gt; 및 &lt;code&gt;resolve&lt;/code&gt; 해줌&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 예시 1. url() -&amp;gt; require()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;image&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;png&lt;/span&gt;) =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./image.png&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 예시 2. @import -&amp;gt; require()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;style.css&amp;#39;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./style.css&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 예시 3. @import url() -&amp;gt; require()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;css&lt;/span&gt;) =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./style.css&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 변환 전 CSS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;h1&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;color&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;FFFFFF&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;body&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;background&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;color&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;272727&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 문자열로 변환된 CSS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;... [&lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;h1 {\n	color: #FFFFFF;\n}\nbody {\n	background-color: #272727;\n}&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;또한, &lt;a href=&#34;https://github.com/css-modules/css-modules&#34;&gt;CSS Module&lt;/a&gt;을 지원해 CSS 클래스 이름이 전역적으로 충돌하는 것을 방지하게 해줌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.npmjs.com/package/style-loader&#34;&gt;style-loader&lt;/a&gt;: &lt;code&gt;css-loader&lt;/code&gt;와 &lt;strong&gt;함께 쓰길 권장&lt;/strong&gt;하는 로더로, &lt;code&gt;CSS&lt;/code&gt;를 &lt;code&gt;DOM&lt;/code&gt;에 주입하는 로더 (정확히는, &lt;em&gt;CSS를 DOM에 주입하는&lt;/em&gt; &lt;code&gt;Javascript 코드로 변환&lt;/code&gt;하는 역할)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;옵션의 &lt;code&gt;injectType&lt;/code&gt;을 통해 &lt;strong&gt;어떻게 &lt;code&gt;style&lt;/code&gt;이 &lt;code&gt;DOM&lt;/code&gt;에 주입될 지&lt;/strong&gt; 지정할 수 있음
&lt;ul&gt;
&lt;li&gt;하나 또는 여러 개의 &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; 태그로 주입할 지(&lt;code&gt;singletonStyleTag&lt;/code&gt;/&lt;code&gt;styleTag&lt;/code&gt;), &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; 태그를 통해 css 파일을 참조하도록 할 지(&lt;code&gt;linkTag&lt;/code&gt;) 등의 옵션이 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;CRA 프로젝트 설정&lt;/em&gt; 에서는 &lt;code&gt;개발 환경&lt;/code&gt;일 경우 &lt;code&gt;style-loader&lt;/code&gt;를, &lt;code&gt;프로덕션 빌드&lt;/code&gt;에서는 &lt;code&gt;MiniCssExtractPlugin&lt;/code&gt;를 사용&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.npmjs.com/package/sass-loader&#34;&gt;sass-loader&lt;/a&gt;: &lt;code&gt;SASS&lt;/code&gt;/&lt;code&gt;SCSS&lt;/code&gt; 파일을 불러와, &lt;code&gt;CSS&lt;/code&gt;로 &lt;code&gt;컴파일&lt;/code&gt;하는 로더&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;css-loader&lt;/code&gt;, &lt;code&gt;style-loader&lt;/code&gt;와 체이닝해 DOM에 즉각적으로 스타일들을 반영하거나, &lt;code&gt;mini-css-extract-plugin&lt;/code&gt;과 체이닝해 개별 CSS 파일로 추출할 수 있음
&lt;ul&gt;
&lt;li&gt;이때, 체인에서 &lt;code&gt;sass-loader&lt;/code&gt;가 이들보다 앞에(즉, 로더 배열의 후순에) 위치해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.npmjs.com/package/postcss-loader&#34;&gt;postcss-loader&lt;/a&gt;: 프로젝트에서 사용된 &lt;code&gt;CSS&lt;/code&gt; 파일을 불러와, &lt;code&gt;PostCSS&lt;/code&gt;의 여러 처리(&lt;code&gt;CSS 린팅&lt;/code&gt;, &lt;code&gt;최신 CSS 문법의 폴리필&lt;/code&gt; 등)들을 수행하도록 하는 로더&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;CRA 프로젝트 설정&lt;/em&gt;에서는 &lt;code&gt;tailwindcss&lt;/code&gt;, &lt;code&gt;postcss-preset-env&lt;/code&gt;, &lt;code&gt;postcss-normalize&lt;/code&gt; 플러그인을 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.npmjs.com/package/file-loader&#34;&gt;file-loader&lt;/a&gt;: Javascript 코드 중 파일을 &lt;code&gt;import&lt;/code&gt; / &lt;code&gt;require()&lt;/code&gt;하는 구문에 대해, 해당 파일을 &lt;code&gt;지정된 디렉토리(output directory)&lt;/code&gt;로 이동시킨 뒤 &lt;code&gt;public URL&lt;/code&gt;을 생성하는 로더&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;public URL&lt;/code&gt;: &lt;em&gt;애플리케이션 내 모든 &lt;code&gt;asset&lt;/code&gt;들이 위치할 기본 경로&lt;/em&gt;인 &lt;a href=&#34;https://webpack.js.org/guides/public-path/&#34;&gt;Public Path&lt;/a&gt;와 해당 자원의 위치를 결합한 URL&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// 변환 전
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;png&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./image.png&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// 변환 후
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;png&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dirname/0dcbbaa701328ae351f.png&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#39;dirname/[contenthash].[ext]&amp;#39; 포맷
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.npmjs.com/package/resolve-url-loader&#34;&gt;resolve-url-loader&lt;/a&gt;: &lt;em&gt;분산된&lt;/em&gt; &lt;code&gt;SCSS&lt;/code&gt; 파일과, 각 &lt;code&gt;SCSS&lt;/code&gt;파일과 관련된 에셋들(이미지, 폰트 등)을 같은 곳에 위치시키도록 해주는 로더&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;여러 곳에 SCSS 파일을 분산&lt;/code&gt;해두었으며, 그와 &lt;code&gt;관련된 에셋들을 같은 곳에 위치&lt;/code&gt;시켜 사용하고, &lt;em&gt;에셋에 대한 접근&lt;/em&gt;을 &lt;code&gt;완전한 상대경로&lt;/code&gt;(현재 파일을 기준으로한 상대 경로, &lt;code&gt;url(./filename.ext)&lt;/code&gt; 또는 &lt;code&gt;url(filename.ext)&lt;/code&gt;)로 접근하는 경우 적합&lt;/li&gt;
&lt;li&gt;&lt;code&gt;웹팩&lt;/code&gt;은 &lt;code&gt;url()&lt;/code&gt; 구문에서 &lt;code&gt;완전한 상대경로&lt;/code&gt;가 사용됐을 경우 해당 &lt;code&gt;에셋&lt;/code&gt;이 &lt;code&gt;루트 SCSS 파일&lt;/code&gt;과 &lt;strong&gt;&lt;code&gt;같은 디렉토리&lt;/code&gt;&lt;/strong&gt; 에 존재한다고 가정하기 때문에 &lt;code&gt;분산 저장된 SCSS 및 에셋&lt;/code&gt; 들을 제대로 처리하지 못함
&lt;img src=&#34;https://raw.githubusercontent.com/bholloway/resolve-url-loader/v5/packages/resolve-url-loader/docs/basic-problem.svg&#34; alt=&#34;distributed-css&#34;&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resolve-url-loader&lt;/code&gt;는 이러한 &lt;code&gt;URL들을 재작성&lt;/code&gt;하여 제대로 동작하도록 도와줌&lt;/li&gt;
&lt;li&gt;참고1) &lt;code&gt;resolve-url-loader&lt;/code&gt;보다 앞서 처리되는 로더가 있는 경우, 해당 로더들은 &lt;code&gt;소스 맵&lt;/code&gt;을 제공해야 함
&lt;ul&gt;
&lt;li&gt;그래야 &lt;code&gt;resolve-url-loader&lt;/code&gt;가 &lt;em&gt;앞선 로더들이 전처리한&lt;/em&gt; &lt;code&gt;CSS 코드&lt;/code&gt;속의 &lt;code&gt;상대 경로&lt;/code&gt;를 &lt;strong&gt;올바르게 파악&lt;/strong&gt;할 수 있기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.npmjs.com/package/source-map-loader&#34;&gt;source-map-loader&lt;/a&gt;: 소스 코드 파일들로부터 &lt;code&gt;소스맵&lt;/code&gt;을 &lt;code&gt;추출&lt;/code&gt;하는 로더&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;소스맵&lt;/code&gt;: &lt;code&gt;원본 소스코드&lt;/code&gt;와 &lt;code&gt;트랜스파일된 소스 코드&lt;/code&gt; 간의 매핑 정보가 선언된 파일
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;압축, 난독화 등의&lt;/em&gt; &lt;code&gt;처리를 거친 코드&lt;/code&gt;와 &lt;code&gt;원본 코드&lt;/code&gt; 간의 관계를 알려주어, &lt;code&gt;트랜스파일링된 코드&lt;/code&gt;의 &lt;code&gt;디버깅&lt;/code&gt;을 도움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;애플리케이션 내(&lt;code&gt;node_modules&lt;/code&gt; 폴더를 포함한)&lt;/em&gt;  &lt;strong&gt;&lt;code&gt;모든 Javascript 엔트리&lt;/code&gt;&lt;/strong&gt; 로 부터 &lt;code&gt;이미 존재하는 소스맵&lt;/code&gt;을 추출하며, 이는 &lt;code&gt;인라인 소스맵&lt;/code&gt; 뿐만 아니라 &lt;code&gt;URL로 링크된 소스맵&lt;/code&gt;도 포함
&lt;ul&gt;
&lt;li&gt;이러한 처리는 &lt;code&gt;자체 소스맵&lt;/code&gt;을 갖고있는 라이브러리의 &lt;code&gt;소스맵&lt;/code&gt;이 &lt;code&gt;웹팩 번들의 소스맵&lt;/code&gt;으로 &lt;code&gt;추출&lt;/code&gt; 및 &lt;code&gt;처리&lt;/code&gt;되지 않을 경우, &lt;code&gt;브라우저&lt;/code&gt;가 &lt;code&gt;소스맵 데이터&lt;/code&gt;를 &lt;code&gt;잘못 해석&lt;/code&gt;하는 일을 &lt;code&gt;방지&lt;/code&gt;해줌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;css--sass-관련&#34; &gt;CSS / SASS 관련
&lt;span&gt;
    &lt;a href=&#34;#css--sass-%ea%b4%80%eb%a0%a8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/browserslist&#34;&gt;browserslist&lt;/a&gt;: &lt;code&gt;Babel&lt;/code&gt;, &lt;code&gt;Autoprefixer&lt;/code&gt; 등 여러 프론트엔드 툴에서 동일한 &lt;code&gt;타깃 브라우저 및 Node.js 런타임 버전&lt;/code&gt;을 공유하기 위한 &lt;code&gt;Configuration&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;이를 통해 불필요한 &lt;code&gt;Polyfil&lt;/code&gt;, &lt;code&gt;벤더 프리픽스&lt;/code&gt; 등을 줄일 수 있으며, 프론트엔드 툴 간 일관성이 보장됨&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CRA 프로젝트 설정에서는&lt;/em&gt; 프로덕션 빌드의 경우 0.2% 이상의 점유율을 지녔으며(&lt;code&gt;&amp;gt;0.2%&lt;/code&gt;) 24개월 내 업데이트가 없는 브라우저를 제외하고(&lt;code&gt;not dead&lt;/code&gt;) 오페라 미니를 제외한(&lt;code&gt;not op_mini all&lt;/code&gt;), 개발 환경에서는 가장 최신 버전의 &lt;code&gt;크롬&lt;/code&gt;/&lt;code&gt;파이어폭스&lt;/code&gt;/&lt;code&gt;사파리&lt;/code&gt; 를 지원 하도록 설정됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/mini-css-extract-plugin&#34;&gt;mini-css-extract-plugin&lt;/a&gt; : &lt;em&gt;CSS를 포함하고 있는 JS 파일 별로&lt;/em&gt; &lt;code&gt;CSS를 추출&lt;/code&gt;해 &lt;em&gt;JS 파일 당&lt;/em&gt; &lt;strong&gt;&lt;code&gt;CSS 파일을 생성&lt;/code&gt;&lt;/strong&gt; 하는 &lt;code&gt;웹팩 플러그인&lt;/code&gt;으로, &lt;code&gt;css-loader&lt;/code&gt;와 함께 사용하기를 권장함
&lt;ul&gt;
&lt;li&gt;다만, &lt;code&gt;웹팩 엔트리 포인트&lt;/code&gt; 또는 &lt;a href=&#34;https://webpack.js.org/concepts/under-the-hood/#chunks&#34;&gt;initial chunk&lt;/a&gt;에서 &lt;strong&gt;import 하고 있는 CSS&lt;/strong&gt;의 경우, (이 플러그인이) &lt;em&gt;페이지에서 해당 CSS들을 로드하도록 하지 않음&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;엔트리 포인트&lt;/code&gt;: &lt;code&gt;webpack.config.js&lt;/code&gt;에서 &lt;code&gt;entry&lt;/code&gt;로 설정된 파일&lt;/li&gt;
&lt;li&gt;&lt;code&gt;initial chunk&lt;/code&gt;: 엔트리 포인트의 &lt;code&gt;메인 청크&lt;/code&gt;를 의미하며, &lt;code&gt;엔트리 포인트&lt;/code&gt;에 &lt;em&gt;명시된 모든 모듈 및 의존성을 포함&lt;/em&gt;하고 있는 청크&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;즉, &lt;em&gt;엔트리 포인트에 대응되는&lt;/em&gt; &lt;code&gt;CSS 파일&lt;/code&gt;의 경우, &lt;strong&gt;자동으로 &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; 태그를 생성&lt;/strong&gt;하거나 / &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; 태그를 포함한 &lt;code&gt;index.html&lt;/code&gt;을 만들기 위해 &lt;a href=&#34;https://github.com/jantimon/html-webpack-plugin&#34;&gt;&lt;code&gt;html-webpack-plugin&lt;/code&gt;&lt;/a&gt;를 사용해야 함
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/html-webpack-plugin&#34;&gt;html-webpack-plugin&lt;/a&gt;: &lt;em&gt;웹팩 번들 서빙을 위한 HTML 파일&lt;/em&gt; &lt;code&gt;생성을 간소화&lt;/code&gt; 시켜주는 &lt;code&gt;웹팩 플러그인&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;If you have any &lt;code&gt;CSS assets&lt;/code&gt; in &lt;strong&gt;webpack&amp;rsquo;s output&lt;/strong&gt; (for example, CSS extracted with the &lt;a href=&#34;https://github.com/webpack-contrib/mini-css-extract-plugin&#34;&gt;mini-css-extract-plugin&lt;/a&gt;) then these will be included with &lt;strong&gt;&lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tags&lt;/strong&gt; in the HTML head.&lt;br&gt;
( 만약 Webpack 출력이 CSS 에셋을 포함할 경우, HTML &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;에 &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; 태그로 포함될 것입니다.)&lt;br&gt;
출처: &lt;a href=&#34;https://github.com/jantimon/html-webpack-plugin?tab=readme-ov-file#usage&#34;&gt;jantimon/html-webpack-plugin: Simplifies creation of HTML files to serve your webpack bundles&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/tailwindcss&#34;&gt;tailwindcss&lt;/a&gt;: &lt;code&gt;유틸리티-우선(utility-first)&lt;/code&gt; CSS 프레임워크로, 프레임워크에서 &lt;code&gt;지정한 클래스 명&lt;/code&gt;을 사용하면 &lt;code&gt;CSS 유틸리티&lt;/code&gt;가 적용됨
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;인라인 스타일&lt;/code&gt;과 비슷하지만&lt;/em&gt;, &lt;a href=&#34;https://tailwindcss.com/docs/theme&#34;&gt;미리정의된 디자인(predefined design)&lt;/a&gt;을 사용할 수 있고 &lt;code&gt;호버/포커스 등 상태&lt;/code&gt; 및 &lt;code&gt;미디어 쿼리&lt;/code&gt;를 사용할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/postcss&#34;&gt;postcss&lt;/a&gt;: &lt;code&gt;Javascript 플러그인&lt;/code&gt;을 사용해 &lt;code&gt;CSS 린팅&lt;/code&gt;, &lt;code&gt;변수&lt;/code&gt; 및 &lt;code&gt;믹스인&lt;/code&gt; 지원, &lt;code&gt;최신 CSS 문법의 트랜스파일&lt;/code&gt; 등의 기능을 제공하는 변환기
&lt;ul&gt;
&lt;li&gt;내부적으로 &lt;code&gt;CSS&lt;/code&gt; -&amp;gt; &lt;code&gt;Parser&lt;/code&gt; -&amp;gt; &lt;code&gt;[Plugin 1, Plugin 2, ... ]&lt;/code&gt; -&amp;gt; &lt;code&gt;Stringifier&lt;/code&gt; -&amp;gt; &lt;code&gt;New CSS&lt;/code&gt;로 이어지는 &lt;a href=&#34;https://postcss.org/docs/postcss-architecture&#34;&gt;구조&lt;/a&gt;를 갖고 있음
&lt;ul&gt;
&lt;li&gt;CSS를 &lt;code&gt;Tokenizer&lt;/code&gt;와 &lt;code&gt;Parser&lt;/code&gt;를 통해 &lt;strong&gt;분해&lt;/strong&gt; 및 &lt;strong&gt;AST화&lt;/strong&gt; 한 뒤, Plugin 들을 적용시키고 나온 &lt;code&gt;AST&lt;/code&gt;를 &lt;code&gt;순수 CSS 문자열&lt;/code&gt;로 변환함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;널리 사용되고 있는 &lt;a href=&#34;https://github.com/postcss/autoprefixer&#34;&gt;autoprefixer&lt;/a&gt;가 대표적인 &lt;code&gt;PostCSS&lt;/code&gt; 플러그인임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/postcss-flexbugs-fixes&#34;&gt;postcss-flexbugs-fixes&lt;/a&gt; : &lt;code&gt;flowbox 이슈&lt;/code&gt; 및 &lt;code&gt;크로스-브라우저 이슈&lt;/code&gt;를 &lt;code&gt;수정&lt;/code&gt;하기 위한 &lt;code&gt;PostCSS 플러그인&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/postcss-normalize&#34;&gt;postcss-normalize&lt;/a&gt;: &lt;a href=&#34;http://browserl.ist/&#34;&gt;&lt;code&gt;browserlist&lt;/code&gt;&lt;/a&gt; 설정에 맞춰 &lt;a href=&#34;https://github.com/csstools/normalize.css&#34;&gt;normalize.css&lt;/a&gt; 라이브러리 또는 &lt;a href=&#34;https://github.com/csstools/sanitize.css&#34;&gt;sanitize.css&lt;/a&gt; 라이브러리를 사용할 수 있도록 해주는 툴
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;normalize.css&lt;/code&gt; : &lt;code&gt;HTML 요소&lt;/code&gt;에 대해 &lt;em&gt;크로스-브라우저 간&lt;/em&gt; &lt;code&gt;일관된 스타일&lt;/code&gt;을 제공하는 CSS 라이브러리
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/csstools/normalize.css/blob/main/normalize.css&#34;&gt;nomarlize.css의 내용&lt;/a&gt;을 살펴보면, &lt;code&gt;중첩 리스트(dl, ol, ul)&lt;/code&gt;의 margin 없애기(line 36), &lt;code&gt;Firefox에서의 box-sizing 추가&lt;/code&gt; 및 &lt;code&gt;border 색상을 상속&lt;/code&gt;하도록 정정(line 46) 하는 등의 내용을 포함함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sanitize.css&lt;/code&gt; : &lt;em&gt;&lt;code&gt;normalize.css&lt;/code&gt;의 모든 요소들이 포함되어 있으며&lt;/em&gt;, 나아가 &lt;code&gt;유용한 기본 설정(useful defaults)&lt;/code&gt;을 포함하는 CSS 라이브러리
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/csstools/sanitize.css/blob/main/sanitize.css&#34;&gt;sanitize.css의 내용&lt;/a&gt;을 살펴보면, &lt;code&gt;커서&lt;/code&gt;는 &lt;em&gt;불명확한 인터페이스에 힌트를 주기 위해서만&lt;/em&gt; 변하도록 하거나(line 37), &lt;code&gt;background-repeat&lt;/code&gt;이 기본적으로 반복되지 않도록 하는(line 13) 등의 내용을 포함함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[postcss-preset-env]: &lt;code&gt;최신 CSS 문법&lt;/code&gt;을 &lt;em&gt;브라우저가 이해할 수 있도록&lt;/em&gt; &lt;code&gt;변환&lt;/code&gt;하고, &lt;code&gt;타겟 브라우저 및 런타임&lt;/code&gt;에 맞춰 &lt;code&gt;필요한 폴리필&lt;/code&gt;을 &lt;code&gt;결정&lt;/code&gt;하는 &lt;strong&gt;&lt;code&gt;PostCSS 플러그인&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/all&#34;&gt;MDN&lt;/a&gt;과 &lt;a href=&#34;https://caniuse.com/css-all&#34;&gt;Can I Use&lt;/a&gt;로부터 &lt;em&gt;버전 별 지원 기능 정보들&lt;/em&gt;을 가져와 &lt;code&gt;browserlist&lt;/code&gt;를 기반으로 &lt;strong&gt;기능의 변환이 필요한지 판단&lt;/strong&gt;하며, 내부적으로 &lt;code&gt;autoprefixer&lt;/code&gt;를 포함해 &lt;em&gt;브라우저 지원 목록에 따라&lt;/em&gt; &lt;strong&gt;필요할때만 접두사를 적용&lt;/strong&gt;하도록 함&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CRA 프로젝트 설정&lt;/em&gt;에서는 &lt;code&gt;autoprefixer: { flexbox: &#39;no-2009&#39; }, stage: 3&lt;/code&gt;라고 옵션을 지정하여 &lt;code&gt;최신&lt;/code&gt; 및 &lt;code&gt;IE 버전&lt;/code&gt;의 &lt;em&gt;flexbox 문법에만&lt;/em&gt; &lt;code&gt;접두사를 추가&lt;/code&gt;하도록 하며, 또한 &lt;code&gt;stage 3&lt;/code&gt;에 해당하는 CSS 기능들을 &lt;strong&gt;변환&lt;/strong&gt;하도록 설정
&lt;ul&gt;
&lt;li&gt;참고1) &lt;a href=&#34;https://preset-env.cssdb.org/playground/&#34;&gt;Interactive Playground - PostCSS Preset Env - CSS Tools&lt;/a&gt;를 통해 &lt;code&gt;browserlist&lt;/code&gt; 옵션 별 변환된 CSS를 확인할 수 있음&lt;/li&gt;
&lt;li&gt;참고2) &lt;code&gt;flexbox&lt;/code&gt;의 경우, 과거 &lt;code&gt;display:box&lt;/code&gt; -&amp;gt; &lt;code&gt;display: flexbox&lt;/code&gt; -&amp;gt; &lt;code&gt;display: flex&lt;/code&gt; 와 같은 변경을 거친 옵션임 &lt;a href=&#34;https://css-tricks.com/old-flexbox-and-new-flexbox/&#34;&gt;&amp;ldquo;Old&amp;rdquo; Flexbox and &amp;ldquo;New&amp;rdquo; Flexbox | CSS-Tricks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;참고3) CSS 기능의 stage 수준을 확인하고 싶다면 &lt;a href=&#34;https://cssdb.org/&#34;&gt;CSS Database - CSS Tools&lt;/a&gt;을 확인할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;eslint-관련&#34; &gt;ESLint 관련
&lt;span&gt;
    &lt;a href=&#34;#eslint-%ea%b4%80%eb%a0%a8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/eslint&#34;&gt;eslint&lt;/a&gt;: Javascript 코드에서 &lt;code&gt;발견된 패턴&lt;/code&gt;을 &lt;code&gt;식별&lt;/code&gt; 및 &lt;code&gt;보고&lt;/code&gt;하는 툴
&lt;ul&gt;
&lt;li&gt;여기서 말하는 &amp;ldquo;패턴&amp;quot;으로는 &lt;code&gt;문법 오류&lt;/code&gt;, &lt;em&gt;버그를 일으킬 수 있는&lt;/em&gt; &lt;code&gt;사용되지 않는 변수&lt;/code&gt;/&lt;code&gt;접근 불가능한 코드&lt;/code&gt; 등의 요소, 정해진 코딩 &lt;code&gt;컨벤션을 위반하는 코드&lt;/code&gt; 등이 있음&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/eslint/js/tree/main/packages/espree&#34;&gt;Espree&lt;/a&gt;를 사용해 Javascript 코드를 파싱하며, 패턴을 확인하기 위해 &lt;code&gt;AST&lt;/code&gt;를 사용함&lt;/li&gt;
&lt;li&gt;&lt;em&gt;사람들이 종종 대체제로 오인하는&lt;/em&gt; &lt;code&gt;Prettier&lt;/code&gt;와는 다른 작업을 수행하는 툴임: &lt;code&gt;Linter&lt;/code&gt;(ESLint)와 &lt;code&gt;Code Formatter&lt;/code&gt;(Prettier)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Linter&lt;/code&gt;는 코드에서 발견되는 &lt;code&gt;잠재적 오류&lt;/code&gt;, &lt;code&gt;안티 패턴&lt;/code&gt; 등을 &lt;strong&gt;&lt;code&gt;식별&lt;/code&gt;하고 &lt;code&gt;경고&lt;/code&gt;&lt;/strong&gt; 하는 도구이고, &lt;code&gt;Code Formatter&lt;/code&gt;는 &lt;code&gt;들여쓰기(indent)&lt;/code&gt;, &lt;code&gt;줄바꿈(line break)&lt;/code&gt; 등의 요소들을 일관되도록 하여 &lt;strong&gt;&lt;code&gt;코드 가독성&lt;/code&gt;&lt;/strong&gt; 을 높이는 도구임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/eslint-config-react-app&#34;&gt;eslint-config-react-app&lt;/a&gt;: &lt;code&gt;CRA&lt;/code&gt;에서 사용되는 &lt;code&gt;ESLint 설정&lt;/code&gt;을 포함하고 있는 패키지
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/facebook/create-react-app/blob/main/packages/eslint-config-react-app/index.js&#34;&gt;create-react-app/packages/eslint-config-react-app/index.js at main · facebook/create-react-app&lt;/a&gt; 에서 그 설정 값들을 확인할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;테스트-관련&#34; &gt;테스트 관련
&lt;span&gt;
    &lt;a href=&#34;#%ed%85%8c%ec%8a%a4%ed%8a%b8-%ea%b4%80%eb%a0%a8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/jest&#34;&gt;jest&lt;/a&gt;: 자바스크립트 테스팅 프레임워크로, 테스트를 찾아 실행하는 &lt;code&gt;테스트 러너&lt;/code&gt; 뿐만 아니라 &lt;code&gt;Test Matcher&lt;/code&gt;(&lt;code&gt;expect()&lt;/code&gt;와 같은 &lt;code&gt;Assertion&lt;/code&gt;)그리고 &lt;code&gt;Test Mock&lt;/code&gt;(&lt;code&gt;jest.spyOn&lt;/code&gt;, &lt;code&gt;jest.mock&lt;/code&gt; 등) 프레임워크를 제공
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;CRA 프로젝트 설정&lt;/em&gt;에서는 &lt;code&gt;&amp;lt;rootDir&amp;gt;/src&lt;/code&gt; 내 모든 &lt;code&gt;js&lt;/code&gt;/&lt;code&gt;jsx&lt;/code&gt;/&lt;code&gt;ts&lt;/code&gt;/&lt;code&gt;tsx&lt;/code&gt; 파일 중 &lt;strong&gt;&lt;code&gt;__test__&lt;/code&gt;폴더 내 모든 테스트 파일&lt;/strong&gt; 또는 &lt;strong&gt;&lt;code&gt;*.spec.{확장자}&lt;/code&gt;/&lt;code&gt;*.test.{확장자}&lt;/code&gt; 파일&lt;/strong&gt; 에 대해 테스트를 수행하도록 설정되어 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/babel-jest&#34;&gt;babel-jest&lt;/a&gt; : &lt;code&gt;코드 전처리(transform)&lt;/code&gt;를 위해 &lt;code&gt;Babel&lt;/code&gt;을 사용하도록 하는 Jest의 플러그인
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Javascript&lt;/code&gt;/&lt;code&gt;JSX&lt;/code&gt; 파일 테스트 전, 전처리 수행&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CRA 프로젝트 설정&lt;/em&gt;에서는 &lt;code&gt;babel-preset-react-app&lt;/code&gt; 프리셋을 사용하고, 해당 프리셋에서 &lt;code&gt;runtime&lt;/code&gt;을 &lt;code&gt;classic&lt;/code&gt;(react 17 미만) 또는 &lt;code&gt;automatic&lt;/code&gt;(&lt;code&gt;_jsx(react/jsx-runtime)&lt;/code&gt;을 사용하는 환경)으로 설정한 &lt;code&gt;트랜스포머&lt;/code&gt;를 생성해 사용하는데에 쓰임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/jest-resolve&#34;&gt;jest-resolve&lt;/a&gt;: &lt;code&gt;jest&lt;/code&gt; 내부에서 배포하는 패키지로, &lt;strong&gt;모듈 경로를 Resolve&lt;/strong&gt; 하는데 사용되는 &lt;code&gt;AsyncResolver&lt;/code&gt;, &lt;code&gt;SyncResolver&lt;/code&gt;와 같은 &lt;code&gt;Resolver&lt;/code&gt;를 배포
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AsyncResolver&lt;/code&gt; - &lt;code&gt;SyncResolver&lt;/code&gt;는 이름 그대로 모듈이름을 &lt;strong&gt;동기적으로&lt;/strong&gt;(&lt;code&gt;resolveStubModuleName : string&lt;/code&gt;) 또는 &lt;strong&gt;비동기적으로&lt;/strong&gt;(&lt;code&gt;resolveStubModuleNameAsync : Promise&lt;/code&gt;) Resolve 할 것인지 차이&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/jest-watch-typeahead&#34;&gt;jest-watch-typeahead&lt;/a&gt;: &lt;code&gt;파일 이름&lt;/code&gt; 또는 &lt;code&gt;테스트 이름&lt;/code&gt;으로 테스트들을 필터링해 실행할 수 있는 플러그인&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;기타-유틸&#34; &gt;기타 유틸
&lt;span&gt;
    &lt;a href=&#34;#%ea%b8%b0%ed%83%80-%ec%9c%a0%ed%8b%b8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/bfj&#34;&gt;bfj&lt;/a&gt;: &lt;code&gt;Big-Friendly JSON&lt;/code&gt;의 약자로, &lt;strong&gt;대형 JSON 데이터 셋&lt;/strong&gt;용 &lt;strong&gt;비동기 스트리밍&lt;/strong&gt; 함수를 제공
&lt;ul&gt;
&lt;li&gt;만약 &lt;strong&gt;큰 JSON 문자열&lt;/strong&gt;을 &lt;strong&gt;파싱&lt;/strong&gt;하거나, &lt;strong&gt;대규모 데이터 셋&lt;/strong&gt;을 &lt;strong&gt;문자열로 변환&lt;/strong&gt;할 경우 이벤트 루프를 독점하고, &lt;code&gt;OOM(메모리 부족) 예외&lt;/code&gt;를 발생시킬 수 있음&lt;/li&gt;
&lt;li&gt;이때, &lt;code&gt;BFJ&lt;/code&gt;는 &lt;code&gt;비동기 함수&lt;/code&gt;, 그리고 &lt;code&gt;사전-할당된 고정-길이 배열&lt;/code&gt;을 사용해 이런 문제를 완화하려고 함&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CRA 프로젝트 설정&lt;/em&gt;에서는 빌드 시 발생하는 &lt;code&gt;stat(warning, error 등)&lt;/code&gt;들을 기록한 &lt;code&gt;bundle-stats.json&lt;/code&gt; 파일을 작성하기 위해 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/camelcase&#34;&gt;camelcase&lt;/a&gt;: &lt;code&gt;대시(-)&lt;/code&gt;/&lt;code&gt;점(.)&lt;/code&gt;/&lt;code&gt;밑줄(_)&lt;/code&gt;/&lt;code&gt;공백( )&lt;/code&gt;으로 구분된 문자열을 &lt;code&gt;camelCase&lt;/code&gt; 또는 &lt;code&gt;PascalCase&lt;/code&gt;로 변환해주는 함수를 제공
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;camelCase&lt;/code&gt;와 &lt;code&gt;PascalCase&lt;/code&gt; 모두, &lt;em&gt;단어들을 합칠때&lt;/em&gt; &lt;strong&gt;공백없이 각 단어의 첫 글자를 대문자&lt;/strong&gt;로 표기한다는 공통점이 있지만 &lt;code&gt;camelCase&lt;/code&gt;는 &lt;strong&gt;첫 번째 단어의 첫 글자를 소문자&lt;/strong&gt;로, &lt;code&gt;PascalCase&lt;/code&gt;는 &lt;em&gt;첫 번째 단어를 포함한&lt;/em&gt; &lt;strong&gt;모든 단어의 첫 글자를 대문자로 표기&lt;/strong&gt;한다는 차이가 있음&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CRA 프로젝트 설정&lt;/em&gt;에서는 &lt;code&gt;커스텀 Jest 트랜스포머(fileTransform.js)&lt;/code&gt;에서 &lt;code&gt;SVG 파일&lt;/code&gt;을 &lt;strong&gt;&lt;code&gt;React 컴포넌트&lt;/code&gt;처럼 가져올 때&lt;/strong&gt;, SVG 파일 이름을 PascalCase로 처리하기 위해 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/dotenv&#34;&gt;dotenv&lt;/a&gt;: &lt;code&gt;.env&lt;/code&gt; 파일로부터 환경 변수들을 불러와, &lt;code&gt;node.js&lt;/code&gt;의 &lt;code&gt;process.env&lt;/code&gt; 객체에 주입하는 패키지
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.env&lt;/code&gt; 파일에는 &lt;code&gt;키=값&lt;/code&gt;으로 이루어진 변수들을 두고 사용&lt;/li&gt;
&lt;li&gt;2년 전부터 &lt;code&gt;dotenv&lt;/code&gt;에 &lt;strong&gt;&lt;code&gt;&amp;quot;암호화 된&amp;quot; .env 파일&lt;/code&gt;&lt;/strong&gt; 을 지원하고, &lt;strong&gt;&lt;code&gt;크로스-플랫폼 일관성&lt;/code&gt;&lt;/strong&gt; 을 지원하는 &lt;a href=&#34;https://www.npmjs.com/package/@dotenvx/dotenvx&#34;&gt;dotenvx&lt;/a&gt;를 사용하길 권고하고 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/dotenv-expand&#34;&gt;dotenv-expand&lt;/a&gt;: &lt;code&gt;dotenv&lt;/code&gt;에 &lt;code&gt;변수 확장(variable expansion)&lt;/code&gt; 기능을 추가한 패키지
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;변수 확장&lt;/code&gt;: 한 변수에서 다른 변수를 &lt;code&gt;${이름}&lt;/code&gt; 구문을 통해 참조할 수 있는 기능
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;HOST_URL=http:&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//localhost:3000 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;API_URL=$&lt;/span&gt;{&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;HOST_URL&lt;/span&gt;}&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/api&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CRA 프로젝트 설정&lt;/em&gt;에서는 &lt;code&gt;env.js&lt;/code&gt;에서 환경 변수들을 설정할 때, &lt;code&gt;.env&lt;/code&gt;파일들을 우선순위가 높은대로 배열에 담은 뒤 순회하며 &lt;code&gt;dotenv&lt;/code&gt; 를 통해 환경변수들을 불러온 뒤, 그 사이에 존재하는 &lt;code&gt;변수 확장&lt;/code&gt;을 처리하기 위해 &lt;code&gt;dotenv-expand&lt;/code&gt;로 한 번 더 처리하는 형태로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/fs-extra&#34;&gt;fs-extra&lt;/a&gt;: &lt;code&gt;node.js&lt;/code&gt;의 &lt;code&gt;fs&lt;/code&gt; 모듈에 포함되어 있지 않은 파일 시스템 메서드를 추가하고, &lt;code&gt;fs&lt;/code&gt; 메서드들에 대한 &lt;code&gt;Promise&lt;/code&gt; 지원을 추가한 패키지
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fs&lt;/code&gt; 모듈의 모든 기능을 포함한채 확장하기 때문에 &lt;code&gt;fs-extra&lt;/code&gt;만 가져와 사용하면 됨&lt;/li&gt;
&lt;li&gt;또한, 모든 &lt;code&gt;fs 메서드&lt;/code&gt;들이 &lt;code&gt;Promise&lt;/code&gt;를 지원하도록 했기 때문에, 별도의 &lt;code&gt;callback&lt;/code&gt;을 넘기지 않을 경우 &lt;code&gt;Promise&lt;/code&gt;를 반환함&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ESM(ES Module)&lt;/code&gt;도 지원하나(&lt;code&gt;fs-extra/esm&lt;/code&gt;), &lt;em&gt;&lt;code&gt;fs&lt;/code&gt; 메서드들이 포함되어 있지 않으므로&lt;/em&gt; &lt;strong&gt;별도로 import&lt;/strong&gt; 해주어야 함&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CRA 프로젝트 설정&lt;/em&gt;에서는 애플리케이션을 build할 때 사용됨
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 1. Yarn 패키지 매니저가 사용되는지 확인하는데 사용
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;useYarn&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;existsSync&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;paths&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;yarnLockFile&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 2. 빌드 디렉토리 내 파일들을 지우는데 사용
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;fs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;emptyDirSync&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;paths&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;appBuild&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 3. `Public` 폴더 내 정적 에셋들을 빌드 디렉토리로 복사하는데에 사용 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;fs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;copySync&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;paths&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;appPublic&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;paths&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;appBuild&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dereference&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;file&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;file&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;paths&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;appHtml&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/identity-obj-proxy&#34;&gt;identity-obj-proxy&lt;/a&gt;: &lt;code&gt;ES6 Proxy&lt;/code&gt;를 이용한 &lt;code&gt;항등(Identity) 객체&lt;/code&gt;를 제공하는 패키지로, &lt;code&gt;CSS 모듈&lt;/code&gt;과 같이 &lt;code&gt;Webpack&lt;/code&gt;이 처리해주는 &lt;code&gt;import&lt;/code&gt; 동작을 &lt;code&gt;모킹&lt;/code&gt;하는데 유용함
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Proxy&lt;/code&gt;: &lt;em&gt;다른 객체에 대한&lt;/em&gt; &lt;code&gt;프록시&lt;/code&gt;를 생성하여, &lt;em&gt;해당 객체의 기본적인 작업&lt;/em&gt;을 &lt;code&gt;가로채고, 재정의&lt;/code&gt;할 수 있도록 하는 &lt;code&gt;ES6 문법&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Proxy(obj, handler)&lt;/code&gt;: &lt;code&gt;Proxy&lt;/code&gt; 생성자는 &lt;code&gt;프록시할 다른 객체(obj)&lt;/code&gt;와 &lt;code&gt;다른 객체의 어떤 작업을 가로채고 해당 작업을 어떻게 재정의할 지 정의된 객체(hanlder)&lt;/code&gt; 두 가지 매개변수를 받음
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy&#34;&gt;정의할 수 있는 &lt;code&gt;handler 함수&lt;/code&gt;&lt;/a&gt;로는 &lt;code&gt;apply()&lt;/code&gt;, &lt;code&gt;construct()&lt;/code&gt;, &lt;code&gt;get()&lt;/code&gt;, &lt;code&gt;set()&lt;/code&gt; 등이 있으며, 아래 &lt;code&gt;idObj&lt;/code&gt;에서는 &lt;em&gt;객체 프로퍼티에 접근하는 메서드&lt;/em&gt;인 &lt;code&gt;get()&lt;/code&gt;을 재정의한 &lt;code&gt;handler function&lt;/code&gt;을 정의하고 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;identity-obj-proxy&lt;/code&gt;에서는 아래와 같이, 접근하려는 key 이름을 그대로 반환하는 &lt;code&gt;Proxy 객체&lt;/code&gt;를 제공함
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;idObj&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Proxy({}, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 객체 내부 메서드(Object internal methods)인 get 호출을 가로채고 대신 응답하는 handler function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getter&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;__esModule&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;항등(Identity) 객체&lt;/code&gt;: 모든 원소를 자기 자신과 같은 값을 대응시키는 함수인 &lt;code&gt;항등 함수(ex) f(x) = x)&lt;/code&gt;처럼, 모든 &lt;code&gt;key&lt;/code&gt;에 대해 &lt;code&gt;obj[key] = &#39;key&#39; (또는 obj.key = &#39;key&#39;)&lt;/code&gt;인 객체&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-jsx&#34; data-lang=&#34;jsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 예시 코드
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// jest.config.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;module&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;exports&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;moduleNameMapper&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\\.jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;lt;rootDir&amp;gt;/__mocks__/fileMock.js&amp;#39;&lt;/span&gt;,   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// CSS 또는 LESS(Leaner Style Sheets) 정적 에셋 모듈 경로에 대해 identity-obj-proxy의 프록시 객체를 대신 사용하도록 설정
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// 즉, 프로젝트 내 사용되는 모든 CSS Module에 대해 className을 `identity-obj-proxy`에서 제공하는 프록시 객체에서 lookup 하도록 설정
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\\.(css|less)$&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;identity-obj-proxy&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	},  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// SomeComponent.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;React&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;Component&lt;/span&gt; } &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;react&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// jest와 같은 프레임워크를 통해 컴포넌트를 테스트 할 땐 이미지, CSS와 같은 정적 에셋들이 특별히 유용하진 않음
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 따라서, 이들을 실제처럼 `css-loader`와 같은 툴을 통해 해싱된 클래스 명을 주입하기 보다, 모킹된 프록시를 만들어 className이 일치하는지만 확인하도록 하는 것이 더 안전하고 편리
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 따라서 `identity-obj-proxy`와 같은 모듈이 제공하는 `항등 객체`에서 className을 lookup해 확인하도록 설정
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./App.css&amp;#39;&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// CSS Module import
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;App&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Component&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;render&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;root&lt;/span&gt;}&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;className&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;styles&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;hello&lt;/span&gt;}&amp;gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Hello&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;world&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/prompts&#34;&gt;prompts&lt;/a&gt;: CLI 프롬프트를 쉽게 만들어주는 패키지
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;jest-cli&lt;/code&gt;, &lt;code&gt;react-dev-utils&lt;/code&gt;에서 의존하는 패키지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/react-app-polyfill&#34;&gt;react-app-polyfill&lt;/a&gt;: &lt;code&gt;Create-React-App&lt;/code&gt; 프로젝트에서 &lt;em&gt;일반적으로 사용된&lt;/em&gt; &lt;code&gt;Javascript 기능&lt;/code&gt;과 &lt;code&gt;최소 요구 사항&lt;/code&gt;에 대한 &lt;code&gt;Polyfill&lt;/code&gt;을 포함하는 패키지
&lt;ul&gt;
&lt;li&gt;프로젝트에서 지원하고자 하는 &lt;code&gt;최소 버전의 진입점&lt;/code&gt;을 &lt;code&gt;import&lt;/code&gt;하면 &lt;code&gt;Create React App&lt;/code&gt; 프로젝트를 이용하기 위한 &lt;code&gt;최소 언어 기능&lt;/code&gt;을 포함하도록 할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 아래와 같은 import문을 프로젝트 진입점(&amp;#39;src/index.js&amp;#39;)의 첫 번째 줄로 기입해야 함
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 최소 IE 9버전 이상(IE9, IE10, IE11, ...)을 지원하려는 경우
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;react-app-polyfill/ie9&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 최소 IE 11버전 이상을 지원하려는 경우
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;react-app-polyfill/ie11&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;또한, &lt;strong&gt;&lt;code&gt;stable&lt;/code&gt;한 기능&lt;/strong&gt;이지만 &lt;em&gt;타겟 브라우저에서 이를 지원하지 않는 경우&lt;/em&gt; 이를 제공하는 Polyfill(&lt;code&gt;&#39;react-app-polyfill/stable&#39;&lt;/code&gt;)을 사용할 수 있음 (&lt;code&gt;Create-React-App&lt;/code&gt;을 사용하고 있는 경우, 사용자가 정의한 &lt;code&gt;browserlist&lt;/code&gt;를 자동적으로 불러와, 타겟 브라우저에서 필요한 폴리필만 가져옴)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/react-dev-utils&#34;&gt;react-dev-utils&lt;/a&gt;: &lt;code&gt;Create-React-App&lt;/code&gt;에서 사용되는 몇가지 유틸리티들을 포함하는 패키지
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;react-dev-utils&lt;/code&gt;는 &lt;code&gt;단일 엔트리 포인트&lt;/code&gt;를 갖고 있지 않으며, 각각의 모듈을 &lt;code&gt;직접 import&lt;/code&gt; 해야 하는 형태로 작성되어 있음&lt;/li&gt;
&lt;li&gt;&lt;code&gt;react-dev-utils&lt;/code&gt;를 구성하는 주요 모듈 중, &lt;code&gt;CRA 프로젝트&lt;/code&gt;에서 사용된 모듈은 다음과 같음
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;InterpolateHtmlPlugin&lt;/code&gt;&lt;/strong&gt;: &lt;a href=&#34;https://github.com/jantimon/html-webpack-plugin&#34;&gt;html-webpack-plugin&lt;/a&gt;을 사용해 &lt;code&gt;index.html&lt;/code&gt;에 &lt;code&gt;사용자 정의 변수&lt;/code&gt;를 &lt;code&gt;삽입&lt;/code&gt;할 수 있도록 돕는 &lt;strong&gt;웹팩 플러그인&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;InlineChunkHtmlPlugin&lt;/code&gt;&lt;/strong&gt;: 마찬가지로 &lt;a href=&#34;https://github.com/jantimon/html-webpack-plugin&#34;&gt;html-webpack-plugin&lt;/a&gt;을 사용해 &lt;code&gt;index.html&lt;/code&gt;에 &lt;code&gt;인라인 스크립트 청크를 삽입&lt;/code&gt;하는 &lt;strong&gt;웹팩 플러그인&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;즉, &lt;code&gt;&amp;lt;script src=&amp;quot;...&amp;quot;&amp;gt;&lt;/code&gt; 대신 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;태그 내부에 직접 코드를 삽입&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ModuleScopePlugin&lt;/code&gt;&lt;/strong&gt;: 애플리케이션의 &lt;code&gt;소스 디렉토리&lt;/code&gt;에서 &lt;code&gt;상대 경로로 가져온(relative import) 파일&lt;/code&gt;들을 디렉토리 외부에서 접근하지 못하도록 보장하는 &lt;strong&gt;웹팩 플러그인&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;getCSSModuleLocalIdent&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;index.module.css&lt;/code&gt;라는 이름의 CSS 파일에 대해 &lt;code&gt;파일 이름&lt;/code&gt; 또는 &lt;code&gt;폴더 이름&lt;/code&gt;을 사용한 &lt;code&gt;CSS 모듈 클래스 이름&lt;/code&gt;을 생성해주는 &lt;strong&gt;&lt;code&gt;style-loader 모듈&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ModuleNotFoundPlugin&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;Webpack&lt;/code&gt;에서 발생하는, &lt;code&gt;모듈을 찾을 수 없다는 에러&lt;/code&gt;를 알기 쉽게 꾸며주는 &lt;strong&gt;웹팩 플러그인&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/fork-ts-checker-webpack-plugin&#34;&gt;&lt;strong&gt;&lt;code&gt;ForkTsCheckerWebpackPlugin&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: 타입스크립트 타입 검사를 별도의 프로세스에서 실행하는 &lt;strong&gt;웹팩 플러그인&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;eslintFormatter&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;Create React App&lt;/code&gt; 콘솔 출력과의 통합을 위한 &lt;strong&gt;커스텀 ESLint 포매터&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;checkRequiredFiles&lt;/code&gt;&lt;/strong&gt;: 필수 파일 목록을 받아 &lt;strong&gt;포함되지 않은 파일들&lt;/strong&gt;을 &lt;a href=&#34;https://www.npmjs.com/package/chalk&#34;&gt;chalk&lt;/a&gt;를 사용해 &lt;strong&gt;터미널에 출력하는 함수&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;formatWebpackMessages&lt;/code&gt;&lt;/strong&gt;: webpack의 &lt;a href=&#34;https://github.com/webpack/docs/wiki/node.js-api#stats&#34;&gt;stats&lt;/a&gt; 객체가 갖고있는 &lt;code&gt;경고 및 에러 메시지&lt;/code&gt;를 &lt;code&gt;추출&lt;/code&gt;하고 꾸며주는 &lt;strong&gt;유틸리티 함수&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;printHostingInstructions&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;패키지 경로&lt;/code&gt;, &lt;code&gt;public URL&lt;/code&gt; 등을 받아, 프로젝트 빌드 후 &lt;code&gt;호스팅 지침을 출력&lt;/code&gt;해주는 &lt;strong&gt;유틸리티 함수&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;FileSizeReporter&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;빌드 전&lt;/code&gt; JS 및 CSS 에셋 &lt;code&gt;파일 크기를 기록&lt;/code&gt;해두고, &lt;code&gt;빌드 후 이들의 크기 비교를 수행하고 출력&lt;/code&gt;하는 &lt;strong&gt;유틸리티 함수 모음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;printBuildError&lt;/code&gt;&lt;/strong&gt;: 잘 알려진 빌드 에러들을 꾸며주는 &lt;strong&gt;유틸리티 함수&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;evalSourceMapMiddleware&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;/__get-internal-source&lt;/code&gt;로 시작하는 요청에서 웹팩 내부 URL(&lt;code&gt;webpack-internal:///&amp;lt;module-id&amp;gt;&lt;/code&gt;)의 &lt;code&gt;module id&lt;/code&gt;를 추출해 &lt;code&gt;&amp;lt;source-text&amp;gt;&amp;lt;sourceMappingURL&amp;gt;&amp;lt;sourceURL&amp;gt;&lt;/code&gt; (모듈 원본 소스코드 + 소스맵 URL(base64 인코딩된 소스맵 정보) + 소스 URL )를 반환하는 &lt;strong&gt;&lt;code&gt;웹팩 내부 미들웨어&lt;/code&gt;&lt;/strong&gt; 생성 함수&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;noopServiceWorkerMiddleware&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;${servedPath}/service-worker.js&lt;/code&gt;라는, 이전의 &lt;code&gt;Service Worker&lt;/code&gt; &lt;strong&gt;설정을 초기화&lt;/strong&gt;하는 파일을 제공하는 &lt;strong&gt;&lt;code&gt;Express&lt;/code&gt; 미들웨어&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ignoredFiles&lt;/code&gt;&lt;/strong&gt;: 소스 디렉토리 외부의 &lt;code&gt;node_modules&lt;/code&gt;를 &lt;strong&gt;파일 감시에서 무시&lt;/strong&gt;하기 위해, 정규표현식을 활용해 &lt;strong&gt;파일 경로 패턴을 생성&lt;/strong&gt;하는 함수
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// webpackDevServer.config.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;watch&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Reportedly, this avoids CPU overload on some systems.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// https://github.com/facebook/create-react-app/issues/293
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// src/node_modules is not ignored to support absolute imports
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// https://github.com/facebook/create-react-app/issues/1065
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;ignored&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ignoredFiles&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;paths&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;appSrc&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      },
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;redirectServedPathMiddleware&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;req.url&lt;/code&gt;이 &lt;code&gt;servedPath&lt;/code&gt;로 시작하지 않을 경우 &lt;code&gt;${servedPath}/${req.path}&lt;/code&gt;로 리다이렉션 시키는 &lt;strong&gt;&lt;code&gt;Express&lt;/code&gt; 미들웨어&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;clearConsole&lt;/code&gt;&lt;/strong&gt;: 콘솔 내용을 지우는 &lt;strong&gt;유틸리티 함수&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;WebpackDevServerUtils&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;WebpackDevServer&lt;/code&gt;를 위한 웹팩 컴파일러 인스턴스를 생성하거나, 대체 포트를 제공하거나, &lt;code&gt;package.json&lt;/code&gt;의 &lt;code&gt;proxy&lt;/code&gt;세팅을 기반으로 &lt;code&gt;WebpackDevServer&lt;/code&gt; 프록시 설정 객체를 생성하는 등의 작업을 수행하는 &lt;strong&gt;유틸리티 함수 모음&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;openBrowser&lt;/code&gt;&lt;/strong&gt;: 주어진 URL과 함께 브라우저를 여는 &lt;strong&gt;유틸리티 함수&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/react-refresh&#34;&gt;react-refresh&lt;/a&gt;: &lt;code&gt;Fast Refresh&lt;/code&gt;라고 부르는, &amp;ldquo;실행중인 React 애플리케이션에서 컴포넌트를 상태값의 손실 없이 편집할 수 있도록 해주는 기능&amp;quot;을 번들러에 통합시키기 위한 패키지
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/facebook/react/issues/16604#issuecomment-528663101&#34;&gt;How should we set up apps for HMR now that Fast Refresh replaces react-hot-loader? · Issue #16604 · facebook/react&lt;/a&gt; 에 따르면, 과거에 사용되던 &lt;a href=&#34;https://www.npmjs.com/package/react-hot-loader&#34;&gt;&lt;code&gt;react-hot-loader&lt;/code&gt;&lt;/a&gt;라는 패키지를 대체하는 패키지임&lt;/li&gt;
&lt;li&gt;&lt;em&gt;CRA 프로젝트 설정&lt;/em&gt;에서는 개발환경이며(&lt;code&gt;isEnvDevelopment&lt;/code&gt;), React Refresh를 사용해야 하는 경우(&lt;code&gt;shouldUseReactRefresh&lt;/code&gt;) &lt;code&gt;ReactRefreshWebpackPlugin&lt;/code&gt; 플러그인을 사용하며, &lt;code&gt;babel-loader&lt;/code&gt;에 &lt;a href=&#34;https://github.com/facebook/react/blob/main/packages/react-refresh/babel.js&#34;&gt;&lt;code&gt;react-refresh/babel&lt;/code&gt;&lt;/a&gt;플러그인을 연결함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/resolve&#34;&gt;resolve&lt;/a&gt;: &lt;code&gt;node.js&lt;/code&gt;의 &lt;code&gt;require.resolve()&lt;/code&gt; 알고리즘을 구현하여, 비동기/동기적으로 &lt;code&gt;require.resolve()&lt;/code&gt;를 호출할 수 있도록 해주는 패키지
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;require.resolve()&lt;/code&gt;: &lt;code&gt;require()&lt;/code&gt;를 통해 모듈을 탐색할 때, 주어진 경로를 해석하는 함수
&lt;ul&gt;
&lt;li&gt;대략적인 pseudo algorithm은 &lt;a href=&#34;https://nodejs.org/api/modules.html#all-together&#34;&gt;문서&lt;/a&gt;참고&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/semver&#34;&gt;semver&lt;/a&gt;: npm을 위한 &lt;code&gt;시멘틱 버전 관리(Semantic Versioning)&lt;/code&gt; 도구.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://semver.org/&#34;&gt;Semantic Versioning 2.0.0 | Semantic Versioning&lt;/a&gt;에 따르면, 의존성이 많은 시스템에서 의존성 지정이 너무 엄격해 발생할 수 있는 &lt;code&gt;버전 락(Version Lock)&lt;/code&gt;, 또는 의존성이 너무 느슨하게 지정되어 발생할 수 있는 &lt;code&gt;버전 난잡성(Version Promiscuity)&lt;/code&gt;를 방지하기 위해서 &lt;code&gt;시멘틱 버전 관리&lt;/code&gt; 사양을 제안함&lt;/li&gt;
&lt;li&gt;&lt;code&gt;시멘틱 버저닝&lt;/code&gt;에서는, &lt;code&gt;X.Y.Z&lt;/code&gt;와 같은 체계의 형태로 버전 번호를 관리하는데, 이때 각 부분은 다음을 의미
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;X&lt;/code&gt;: 메이저 업데이트. &lt;em&gt;하위 호환성이 &lt;strong&gt;없는&lt;/strong&gt; API&lt;/em&gt;의 &lt;code&gt;변경 사항&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Y&lt;/code&gt;: 마이너 업데이트. &lt;em&gt;하위 호환성이 &lt;strong&gt;있는&lt;/strong&gt;(Backward Compatible)&lt;/em&gt; &lt;code&gt;API&lt;/code&gt;의 &lt;code&gt;추가/변경 사항&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Z&lt;/code&gt;: 패치. &lt;em&gt;API에 영향을 주지않는&lt;/em&gt; &lt;code&gt;버그 수정(Bug Fixes)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이러한 &lt;code&gt;시멘틱 버저닝 관리 체계&lt;/code&gt;에 있어, 유용한 여러 &lt;code&gt;유틸리티 함수&lt;/code&gt;를 제공하는 것이 &lt;code&gt;semver&lt;/code&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;semver&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;semver&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;semver&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;valid&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1.2.3&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#39;1.2.3&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;semver&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;valid&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a.b.c&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;// null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;semver&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;clean&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;  =v1.2.3   &amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#39;1.2.3&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;semver&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;satisfies&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1.2.3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1.x || &amp;gt;=2.5.0 || 5.0.0 - 7.2.3&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;// 첫 번째 인자가 두 번째 인자로 주어진 버전 조건을 만족하는가? true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;semver&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;gt&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1.2.3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;9.8.7&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;// 첫 번째 인자가 두 번째 인자보다 높은 버전인가? false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;semver&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;lt&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1.2.3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;9.8.7&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;// 첫 번째 인자가 두 번째 인자보다 낮은 버전인가? true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ejecting-이후-콘솔에-출력된-메세지&#34; &gt;Ejecting 이후 콘솔에 출력된 메세지
&lt;span&gt;
    &lt;a href=&#34;#ejecting-%ec%9d%b4%ed%9b%84-%ec%bd%98%ec%86%94%ec%97%90-%ec%b6%9c%eb%a0%a5%eb%90%9c-%eb%a9%94%ec%84%b8%ec%a7%80&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;// 의존성용 config 파일들 및 스크립트 파일 생성
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \config\env.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \config\getHttpsConfig.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \config\modules.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \config\paths.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \config\webpack.config.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \config\webpackDevServer.config.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \config\jest\babelTransform.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \config\jest\cssTransform.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \config\jest\fileTransform.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \scripts\build.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \scripts\start.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \scripts\test.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding \config\webpack\persistentCache\createEnvironmentHash.js to the project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;// 감춰져있던 의존성들 추가
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Updating the dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Removing react-scripts from dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding @babel/core to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding @pmmmwh/react-refresh-webpack-plugin to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding @svgr/webpack to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding babel-jest to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding babel-loader to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding babel-plugin-named-asset-import to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding babel-preset-react-app to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding bfj to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding browserslist to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding camelcase to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding case-sensitive-paths-webpack-plugin to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding css-loader to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding css-minimizer-webpack-plugin to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding dotenv to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding dotenv-expand to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding eslint to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding eslint-config-react-app to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding eslint-webpack-plugin to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding file-loader to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding fs-extra to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding html-webpack-plugin to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding identity-obj-proxy to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding jest to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding jest-resolve to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding jest-watch-typeahead to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding mini-css-extract-plugin to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding postcss to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding postcss-flexbugs-fixes to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding postcss-loader to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding postcss-normalize to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding postcss-preset-env to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding prompts to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding react-app-polyfill to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding react-dev-utils to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding react-refresh to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding resolve to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding resolve-url-loader to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding sass-loader to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding semver to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding source-map-loader to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding style-loader to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding tailwindcss to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding terser-webpack-plugin to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding webpack to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding webpack-dev-server to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding webpack-manifest-plugin to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding workbox-webpack-plugin to dependencies
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;Updating the scripts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&lt;/span&gt;Configuring package.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding Jest configuration
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Adding Babel preset
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;참고&#34; &gt;참고
&lt;span&gt;
    &lt;a href=&#34;#%ec%b0%b8%ea%b3%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;각 의존성들의 Github Repository 및 공식 문서&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>[Webpack/Vite 파헤치기] 1. Create React App의 Deprecated 발표</title>
      <link>https://cloudsoswift.github.io/post/develop/javascript/bundler/deprecate-of-cra/</link>
      <pubDate>Thu, 29 May 2025 23:50:07 +0900</pubDate>
      
      <guid>https://cloudsoswift.github.io/post/develop/javascript/bundler/deprecate-of-cra/</guid>
      <description>&lt;h1 id=&#34;서론&#34; &gt;서론
&lt;span&gt;
    &lt;a href=&#34;#%ec%84%9c%eb%a1%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;SSAFY 과정에서 &lt;code&gt;Webpack(Create React App)&lt;/code&gt; 기반의 React App과 &lt;code&gt;Vite&lt;/code&gt; 기반의 React App의 개발 서버 구동 및 빌드시간에 현저한 격차가 있음을 확인했습니다.&lt;br&gt;
하지만, &lt;code&gt;Create React App&lt;/code&gt;의 경우, Webpack 뿐만 아니라 내포한 다른 추가적인 라이브러리들이 있기 때문에 명확한 비교가 아니라는 것을 깨닫게 되었습니다.&lt;br&gt;
따라서 최대한 여러 플러그인, 라이브러리들을 배제하고 비슷한 환경을 구성해 테스트를 해야 겠다는 생각이 들었습니다.&lt;br&gt;
올해 2월, React측에서 &lt;code&gt;CRA(Create-react-app)&lt;/code&gt;이 &lt;code&gt;deprecated&lt;/code&gt;되었다고 발표했습니다.(&lt;a href=&#34;https://react.dev/blog/2025/02/14/sunsetting-create-react-app&#34;&gt;Sunsetting Create React App – React&lt;/a&gt;)&lt;br&gt;
따라서 발표 이후, 새로운 React App을 생성하는데에 &lt;code&gt;다른 프레임워크들&lt;/code&gt;을 사용하기를 권장하고 있습니다. 또한, 현재 &lt;code&gt;CRA&lt;/code&gt;기반의 React App들도 다른 프레임워크나 빌드 툴로 마이그레이션 하기를 권장하고 있습니다.&lt;br&gt;
아래 내용은 위 React의 Deprecated 발표를 번역한 내용입니다.&lt;/p&gt;
&lt;h2 id=&#34;cra의-대체-프레임워크&#34; &gt;CRA의 대체 프레임워크
&lt;span&gt;
    &lt;a href=&#34;#cra%ec%9d%98-%eb%8c%80%ec%b2%b4-%ed%94%84%eb%a0%88%ec%9e%84%ec%9b%8c%ed%81%ac&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;h3 id=&#34;nextjs&#34; &gt;Next.js
&lt;span&gt;
    &lt;a href=&#34;#nextjs&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-command&#34; data-lang=&#34;command&#34;&gt;npx create-next-app@latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vercel에서 관리중인 풀스택 프레임워크 입니다.&lt;/p&gt;
&lt;h3 id=&#34;react-router&#34; &gt;React Router
&lt;span&gt;
    &lt;a href=&#34;#react-router&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-command&#34; data-lang=&#34;command&#34;&gt;npx create-react-router@latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vite와 결합하여 풀스택 프레임워크를 만들 수 있는 라우팅 라이브러리 입니다.&lt;/p&gt;
&lt;h3 id=&#34;expo&#34; &gt;Expo
&lt;span&gt;
    &lt;a href=&#34;#expo&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-command&#34; data-lang=&#34;command&#34;&gt;npx create-expo-app@latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&#34;https://expo.dev/about&#34;&gt;Expo&lt;/a&gt;에서 관리중인 풀스택 프레임워크로, 네이티브 UI를 갖춘 범용 Android, iOS 및 웹 앱을 만들수 있는 프레임워크 입니다.&lt;/p&gt;
&lt;h2 id=&#34;빌드-툴의-한계&#34; &gt;빌드 툴의 한계
&lt;span&gt;
    &lt;a href=&#34;#%eb%b9%8c%eb%93%9c-%ed%88%b4%ec%9d%98-%ed%95%9c%ea%b3%84&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;CRA&lt;/code&gt;와 같은 &lt;code&gt;빌드 툴&lt;/code&gt;은 기본적으로 &lt;code&gt;dev 서버&lt;/code&gt;, &lt;code&gt;린팅&lt;/code&gt;, &lt;code&gt;production 빌드&lt;/code&gt; 등에 대한 설정이 되어있어 React App을 구축하기 편리했습니다.
하지만, 이러한 빌드 툴들은 실제 &lt;code&gt;Production App&lt;/code&gt;을 빌드하는데 있어 필요한 &lt;code&gt;라우팅&lt;/code&gt;, &lt;code&gt;데이터 페칭&lt;/code&gt;, &lt;code&gt;코드 스플리팅&lt;/code&gt; 등의 문제에 대한 해결책을 필요로 합니다.
따라서 React 측에서는 상기한 &lt;code&gt;프레임워크를 사용&lt;/code&gt;하기를 &lt;code&gt;권장&lt;/code&gt;하고 있습니다.&lt;/p&gt;
&lt;h3 id=&#34;라우팅&#34; &gt;라우팅
&lt;span&gt;
    &lt;a href=&#34;#%eb%9d%bc%ec%9a%b0%ed%8c%85&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;CRA&lt;/code&gt;에는 어떠한 &lt;code&gt;라우팅 솔루션&lt;/code&gt;이 포함되어 있지 않아, &lt;a href=&#34;https://reactrouter.com/&#34;&gt;React Router&lt;/a&gt; 또는 &lt;a href=&#34;https://tanstack.com/router/latest&#34;&gt;Tanstack Router&lt;/a&gt;와 같은 &lt;code&gt;라우팅 라이브러리&lt;/code&gt;의 도움을 받아 라우팅을 해야 합니다.&lt;/p&gt;
&lt;h3 id=&#34;데이터-페칭데이터-불러오기&#34; &gt;데이터 페칭(데이터 불러오기)
&lt;span&gt;
    &lt;a href=&#34;#%eb%8d%b0%ec%9d%b4%ed%84%b0-%ed%8e%98%ec%b9%ad%eb%8d%b0%ec%9d%b4%ed%84%b0-%eb%b6%88%eb%9f%ac%ec%98%a4%ea%b8%b0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-jsx&#34; data-lang=&#34;jsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Dashboard&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;setData&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;useState&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// ❌ Fetching data in a component causes network waterfalls
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;useEffect&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;fetch&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/api/data&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      .&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      .&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setData&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }, []);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      {&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt; =&amp;gt; &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;}&amp;gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;}&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;)}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CRA&lt;/code&gt;에는 특정한 &lt;code&gt;데이터 페칭 솔루션&lt;/code&gt;이 포함되어 있지 않습니다. 따라서 보통 &lt;code&gt;effect&lt;/code&gt;내부에서 &lt;code&gt;fetch API&lt;/code&gt;와 같은 기능을 사용해 데이터를 불러오는데, 이는 컴포넌트 렌더링 후 데이터를 불러와 &lt;code&gt;네트워크 워터폴&lt;/code&gt;이 발생할 수 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;네트워크 워터폴&lt;/code&gt;: &lt;code&gt;네트워크 요청&lt;/code&gt;이 &lt;em&gt;병렬적으로 이뤄지지 않고&lt;/em&gt;, 순서대로 이루어져 &lt;em&gt;페이지 컨텐츠를 볼 수 있는데까지&lt;/em&gt; 소요되는 &lt;code&gt;시간이 늘어나는 현상&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;위 코드에서도 &lt;code&gt;컴포넌트 함수 코드 불러오기&lt;/code&gt; -&amp;gt; &lt;code&gt;컴포넌트 함수 실행&lt;/code&gt; -&amp;gt; &lt;code&gt;컴포넌트 함수 내부 effect의 fetch 함수 실행&lt;/code&gt; -&amp;gt; &lt;code&gt;fetch를 통해 불러온 데이터 기반으로 렌더링&lt;/code&gt; 으로 이어지는 일련의 과정이 순차적으로 실행될 것임을 예상할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-jsx&#34; data-lang=&#34;jsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;loader&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetch&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`/api/data`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ✅ Fetching data in parallel while the code is downloading
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Dashboard&lt;/span&gt;({&lt;span style=&#34;color:#a6e22e&#34;&gt;loaderData&lt;/span&gt;}) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      {&lt;span style=&#34;color:#a6e22e&#34;&gt;loaderData&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt; =&amp;gt; &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;}&amp;gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;}&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;)}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;이러한 문제를 해결하기 위해 &lt;code&gt;미리 데이터를 페칭(prefetch)&lt;/code&gt;하는 옵션을 제공하는 &lt;a href=&#34;https://react-query.tanstack.com/&#34;&gt;React Query&lt;/a&gt;, &lt;a href=&#34;https://swr.vercel.app/&#34;&gt;SWR&lt;/a&gt;, &lt;a href=&#34;https://www.apollographql.com/docs/react&#34;&gt;Apollo&lt;/a&gt;, &lt;a href=&#34;https://relay.dev/&#34;&gt;Relay&lt;/a&gt;와 같은 라이브러리의 도움을 받을 수 있습니다. 특히 이러한 라이브러리들은 라우팅의 &lt;code&gt;loader&lt;/code&gt; 패턴과 결합하여, 라우팅 레벨에서의 &lt;code&gt;데이터 종속성&lt;/code&gt;을 지정할 경우 가장 적합하게 작동합니다.
위 코드의 경우, &lt;code&gt;라우터&lt;/code&gt;가 &lt;em&gt;라우트 렌더링 이전&lt;/em&gt; &lt;code&gt;데이터를 불러&lt;/code&gt;와 &amp;ldquo;렌더링에 필요한 데이터&amp;quot;와 &amp;ldquo;라우트&amp;quot;를 동시에 가져오도록, 즉 병렬 처리를 하도록 할 수 있습니다.&lt;/p&gt;
&lt;h3 id=&#34;코드-스플리팅&#34; &gt;코드 스플리팅
&lt;span&gt;
    &lt;a href=&#34;#%ec%bd%94%eb%93%9c-%ec%8a%a4%ed%94%8c%eb%a6%ac%ed%8c%85&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;CRA&lt;/code&gt;에는 특정한 &lt;code&gt;코드 스플리팅 솔루션&lt;/code&gt;이 포함되어 있지 않아, React App이 &lt;code&gt;단일 번들 파일&lt;/code&gt;로 제공됩니다. 이는 사용자가 필요하지 않는 코드들까지 다운받게 하므로, 연관된 코드들끼리 묶인 번들로 분할하도록 해 앱 로딩에 걸리는 시간을 줄이는게 좋습니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-jsx&#34; data-lang=&#34;jsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;lazy&lt;/span&gt; } &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;react&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// lazy 함수에는 React 컴포넌트를 resolve하는, Promise와 같은 thenable 객체를 인자로 넘깁니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 이후 `lazy 함수로 감싼 컴포넌트`를 처음 렌더링하려고 할 때 React는 렌더링을 시작합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MarkdownPreview&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lazy&lt;/span&gt;(() =&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./MarkdownPreview.js&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;React에서는 이를 위해 &lt;a href=&#34;https://react.dev/reference/react/lazy&#34;&gt;&lt;code&gt;React.lazy&lt;/code&gt;&lt;/a&gt; 기능을 제공하지만, 이는 컴포넌트가 렌더링 될 때까지 코드를 페칭하지 않으므로 &lt;code&gt;네트워크 워터폴&lt;/code&gt;을 발생시킬 수 있습니다.
더 최적의 방식으로 이를 해결하려면 라우터를 통해 코드 다운로드와 함께 코드 페칭을 병렬로 수행하는 방식을 적용하는게 좋습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;좀 더 자세히 말하자면, &lt;code&gt;컴포넌트 코드 다운로드&lt;/code&gt;와 함께, 컴포넌트와 연관된 &lt;code&gt;loader&lt;/code&gt;, &lt;code&gt;action&lt;/code&gt;등의 함수의 실행도 병렬적으로 수행한다는 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-jsx&#34; data-lang=&#34;jsx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Home&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./Home&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Dashboard&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./Dashboard&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// lazy 설정된 라우트들은 해당 라우트로 이동할 때 컴포넌트의 코드를 다운로드 합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 각 라우트들은 지정된 컴포넌트(라우트 모듈)들을 동적 import한 결과를 반환합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;router&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;createBrowserRouter&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;lazy&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; () =&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./Home&amp;#39;&lt;/span&gt;)},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/dashboard&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;lazy&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; () =&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Dashboard&amp;#39;&lt;/span&gt;)}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 라우트 모듈 내부에서는 라우트에 대해 정의하고 싶은 속성들을 export 합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;loader&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt; }) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fetchData&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;request&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Component&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;useLoaderData&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;You&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;made&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;}&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorBoundary&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;useRouteError&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;isRouteErrorResponse&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      {&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;status&lt;/span&gt;} {&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;statusText&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ) &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;}&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;예시로 &lt;code&gt;React Router&lt;/code&gt;에서 제공하는 &lt;a href=&#34;https://reactrouter.com/6.30.0/route/lazy&#34;&gt;&lt;code&gt;lazy&lt;/code&gt;&lt;/a&gt; 기능을 사용하면 설정된 라우트를 동적으로 &lt;code&gt;지연 로딩&lt;/code&gt;하여 초기 번들의 크기를 줄일 수 있습니다.&lt;/p&gt;
&lt;h1 id=&#34;참고&#34; &gt;참고
&lt;span&gt;
    &lt;a href=&#34;#%ec%b0%b8%ea%b3%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://react.dev/learn/creating-a-react-app&#34;&gt;Creating a React App – React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://react.dev/blog/2025/02/14/sunsetting-create-react-app&#34;&gt;Sunsetting Create React App – React&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>[Javascript] Prototype 알아보기</title>
      <link>https://cloudsoswift.github.io/post/develop/javascript/prototype/</link>
      <pubDate>Thu, 18 Jul 2024 11:47:14 +0900</pubDate>
      
      <guid>https://cloudsoswift.github.io/post/develop/javascript/prototype/</guid>
      <description>&lt;h1 id=&#34;서론&#34; &gt;서론
&lt;span&gt;
    &lt;a href=&#34;#%ec%84%9c%eb%a1%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/orm712/CS-712&#34;&gt;CS 스터디&lt;/a&gt;에서 7월 9일 발표한 &lt;a href=&#34;https://github.com/orm712/CS-712/blob/main/08-JAVASCRIPT/5_Prototype/Readme.md&#34;&gt;&lt;strong&gt;Prototype&lt;/strong&gt;&lt;/a&gt;에 대해 정리한 문서를 블로그에 공유하고자 한다.&lt;/p&gt;
&lt;h2 id=&#34;prototype-in-javascript&#34; &gt;&lt;code&gt;prototype&lt;/code&gt; in Javascript
&lt;span&gt;
    &lt;a href=&#34;#prototype-in-javascript&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;객체지향 프로그래밍 언어들에서 기존 코드를 확장하는 방식 중 대표적인 방식으로 &lt;code&gt;상속(Inheritance)&lt;/code&gt;이 있습니다.&lt;br&gt;
자바스크립트에서는 이러한 상속을 &lt;code&gt;객체&lt;/code&gt;를 사용해 구현합니다.&lt;/p&gt;
&lt;h3 id=&#34;프로토타입-체인&#34; &gt;프로토타입 체인
&lt;span&gt;
    &lt;a href=&#34;#%ed%94%84%eb%a1%9c%ed%86%a0%ed%83%80%ec%9e%85-%ec%b2%b4%ec%9d%b8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;각 객체들은 &lt;strong&gt;&lt;code&gt;프로토타입(prototype)&lt;/code&gt;&lt;/strong&gt; 이라는 다른 객체에 대한 내부적인 링크를 갖고 있습니다. 그리고 그 &lt;code&gt;프로토타입&lt;/code&gt; 객체는 또 다른 자체 &lt;code&gt;프로토타입&lt;/code&gt;을 가지며, &lt;code&gt;프로토타입 체인&lt;/code&gt;이라 부르는 이러한 연결은 &lt;code&gt;null&lt;/code&gt;을 &lt;code&gt;프로토타입&lt;/code&gt;으로 가지는 객체에 도달할 때 까지 계속됩니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이 &lt;code&gt;null&lt;/code&gt;은 &lt;code&gt;프로토타입 체인&lt;/code&gt;의 최종 링크 역할을 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;프로토타입 체인&lt;/code&gt;을 이루는 객체 중 어떤 멤버든 변경할 수 있으며, &lt;code&gt;런타임&lt;/code&gt;에 &lt;strong&gt;프로토타입을 교체&lt;/strong&gt;하는 것이 가능하므로 &lt;code&gt;정적 디스패치(static dispatching)&lt;/code&gt;와 같은 개념은 자바스크립트에 &lt;strong&gt;존재하지 않습니다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;정적 디스패치(static dispatch)&lt;/code&gt;: 다형성의 구현 방식 중 하나로, &lt;strong&gt;&lt;code&gt;컴파일 시간&lt;/code&gt;&lt;/strong&gt; 에 어떤 메서드나 함수의 구현을 사용할 지 선택하는 방법입니다. 이에 대응되는 개념으로는 &lt;code&gt;런타임 시간&lt;/code&gt;에 이를 결정하는 &lt;code&gt;동적 디스패치(dynamic dispatch)&lt;/code&gt;가 있습니다.
&lt;ul&gt;
&lt;li&gt;C++의 &lt;code&gt;template&lt;/code&gt;이 이러한 예이며, Rust 역시 아래와 같은 코드가 있다고 할때, &lt;code&gt;컴파일러&lt;/code&gt;가 전달된 인자의 타입을 보고, 그에 맞는 코드를 따로 실행하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// rust의 trait은 타입 간의 공통된 사항들을 정의합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// (Java의 Interface와 유사하지만 더 강력한 개념)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 예를 들어, 아래 Speak이라는 trait을 가지는 타입은 반드시 speak 함수를 가져야 합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;trait&lt;/span&gt; Speak {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;speak&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Cat&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Cat 타입에 Speak trait을 붙이는 코드입니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;impl&lt;/span&gt; Speak &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; Cat {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// Speak trait에 포함된 &amp;#39;speak&amp;#39; 함수를 구현해야 합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;speak&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;self) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        println!(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Meow!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Speak trait을 갖는 타입을 인자로 받는 함수
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;talk&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;T: &lt;span style=&#34;color:#a6e22e&#34;&gt;Speak&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;(pet: &lt;span style=&#34;color:#a6e22e&#34;&gt;T&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pet.speak();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; pet &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Cat;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    talk(pet);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;코드 출처: &lt;a href=&#34;https://en.wikipedia.org/wiki/Static_dispatch&#34;&gt;Static dispatch - Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;프로퍼티-상속하기&#34; &gt;프로퍼티 상속하기
&lt;span&gt;
    &lt;a href=&#34;#%ed%94%84%eb%a1%9c%ed%8d%bc%ed%8b%b0-%ec%83%81%ec%86%8d%ed%95%98%ea%b8%b0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;자바스크립트의 객체는 자유롭게 &lt;code&gt;프로퍼티&lt;/code&gt;를 추가 및 제거할 수 있는, &lt;code&gt;property&lt;/code&gt;로 이뤄진 &lt;code&gt;동적인 가방&lt;/code&gt;이라고 할 수 있습니다.&lt;br&gt;
객체에서 &lt;code&gt;프로퍼티&lt;/code&gt;를 탐색할 때는 &lt;code&gt;현재 객체가 가진 프로퍼티(own property)&lt;/code&gt; 뿐만 아니라, &lt;code&gt;프로토타입 체인&lt;/code&gt;의 끝까지 탐색하며 이를 구성하는 &lt;code&gt;프로토타입&lt;/code&gt;들에서도 찾는 형태로 동작합니다.&lt;br&gt;
다음 코드는 후술할 &lt;strong&gt;프로토타입 접근 및 설정 방법&lt;/strong&gt; 중 대표적인 방식인 &lt;code&gt;obj.__proto__&lt;/code&gt; 구문을 통해 객체의 &lt;code&gt;프로토타입&lt;/code&gt;을 설정하고, &lt;code&gt;프로토타입 체인&lt;/code&gt;을 이루는 코드입니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;o&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// __proto__ 프로퍼티를 통해 프로토타입을 설정합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 이때, 다른 객체 변수명을 할당하거나, 객체 리터럴을 할당할 수 있습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;__proto__&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;__proto__&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 이렇게 되면, 객체 o를 이루는 프로토타입 체인은 다음과 같습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// { a: 1, b: 2 } ---&amp;gt; { b: 3, c: 4 } ---&amp;gt; { d: 5 } ---&amp;gt; Object.prototype ---&amp;gt; null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;o&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// o에는 내부 프로퍼티인 a가 존재하므로 해당 값을 가져옵니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;o&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// o와 o의 프로토타입 모두 b를 가지고 있습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 이러한 경우, 프로토타입 체인에서 더 가까운 위치에 존재하는 프로퍼티를 우선합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 즉, 여기서는 o의 내부 프로퍼티 b의 값인 2를 가져옵니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 이처럼 프로토타입 체인 상에서 동일한 이름의 프로퍼티가 존재할 경우
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 프로토타입 체인에서 더 가까운 프로퍼티를 찾으면 이후 프토토타입들을 더 탐색하지 않는 것을
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 프로퍼티 섀도잉(Property Shadowing)이라고 합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;o&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// 4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// o에는 c 프로퍼티가 없기 때문에, 프로토타입 체인을 탐색합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// o.[[prototype]]에 c가 존재하기 때문에, 해당 값인 4를 가져옵니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;o&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// undefined
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// o에는 e 프로퍼티가 없기 때문에, 프로토타입 체인을 탐색합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// o.[[prototype]]을 탐색하나, 이 역시 e 프로퍼티가 없습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// o.[[prototype]].[[prototype]]을 탐색하나, 이 역시 e 프로퍼티가 없습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// o.[[prototype]].[[prototype]].[[prototype]], 즉 Object.prototype을 탐색하나, 이 역시 e 프로퍼티가 없습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Object.prototype의 프로토타입은 null이므로, 프로토타입 체인 탐색을 종료합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 프로퍼티를 찾지 못했기 때문에, undefined를 반환합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;위 구조를 그림으로 표현하면 아래와 같습니다.&lt;br&gt;
&lt;img src=&#34;example-prototype.png&#34; alt=&#34;example-prototype&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;메서드-상속하기&#34; &gt;메서드 상속하기
&lt;span&gt;
    &lt;a href=&#34;#%eb%a9%94%ec%84%9c%eb%93%9c-%ec%83%81%ec%86%8d%ed%95%98%ea%b8%b0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;자바스크립트에서는 클래스-기반 언어들에 존재하는 &lt;em&gt;&lt;code&gt;메서드&lt;/code&gt;라는 개념이 존재하지 않으며&lt;/em&gt;, 대신 &lt;code&gt;프로퍼티 형태&lt;/code&gt;로 객체에 &lt;strong&gt;함수를 추가&lt;/strong&gt;할 수 있습니다.&lt;br&gt;
이와 같은 방식으로 상속한 함수는 상기한 프로퍼티들의 동작방식 대로 동작하며, 마찬가지로 &lt;code&gt;프로퍼티 섀도잉&lt;/code&gt;이 이뤄집니다.&lt;br&gt;
유의할 점은, 상속된 함수가 실행될 경우 해당 함수 내부의 &lt;code&gt;this&lt;/code&gt; 값은 &lt;code&gt;해당 함수를 지닌 프로토타입 객체&lt;/code&gt;가 아닌 &lt;strong&gt;&lt;code&gt;함수를 상속받은 객체&lt;/code&gt;&lt;/strong&gt; 를 가리킵니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parent&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;child&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;__proto__&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;parent&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;parent&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;child&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// 4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// child.add() 를 호출한 순간, 프로토타입 체인을 탐색하며 add 함수를 찾습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 그리고 add 함수 내부의 this는 child를 가리키게 됩니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 이때, child는 value 프로퍼티를 갖고있지 않기 때문에, 프로토타입 체인을 탐색하며 value 프로터피를 찾습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 그리고 parent의 value 프로퍼티 값인 3을 가져와 1을 더하고, this.value에 할당합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 따라서 child 역시 내부 프로퍼티인 value를 갖게되며, 이 값은 4가 됩니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/ { value: 4,  __proto__: { value: 3, add: [Function] } }&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;parent&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// 4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;child&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// 5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 앞선 child.add()로 child 역시 value 프로퍼티를 갖게 되었으므로 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// child.value가 parent.value를 가리게되고(프로퍼티 섀도잉), 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// child.value 값인 4에 1을 더한 5를 반환합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;생성자-함수constructor&#34; &gt;&lt;code&gt;생성자 함수(Constructor)&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#%ec%83%9d%ec%84%b1%ec%9e%90-%ed%95%a8%ec%88%98constructor&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;h4 id=&#34;프로토타입을-활용한-생성자-함수-개선&#34; &gt;프로토타입을 활용한 생성자 함수 개선
&lt;span&gt;
    &lt;a href=&#34;#%ed%94%84%eb%a1%9c%ed%86%a0%ed%83%80%ec%9e%85%ec%9d%84-%ed%99%9c%ec%9a%a9%ed%95%9c-%ec%83%9d%ec%84%b1%ec%9e%90-%ed%95%a8%ec%88%98-%ea%b0%9c%ec%84%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;또한 &lt;code&gt;프로토타입&lt;/code&gt;은 객체를 생성하는 &lt;code&gt;생성자 함수&lt;/code&gt;에서, 함수를 통해 생성된 인스턴스들이 가지는 프로퍼티를 지정하는데 사용할 수 있습니다.&lt;br&gt;
&lt;code&gt;value&lt;/code&gt;라는 값과 &lt;code&gt;method&lt;/code&gt;라는 함수를 가지는 객체 여럿을 생성해야 한다고 합시다.
단순히 구현한다면 다음과 같이 구현할 수도 있습니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;boxes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt;() { &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;; } },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt;() { &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;; } },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt;() { &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;; } },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;이는 각 인스턴스 마다 동일한 작업을 수행하는 자체 함수 프로퍼티가 있는 형태로, 함수들이 중복되고 불필요한 형태입니다.&lt;br&gt;
&lt;code&gt;method&lt;/code&gt; 함수를 &lt;code&gt;프로토타입&lt;/code&gt;으로 옮긴다면 어떨까요?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;boxPrototype&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;boxes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;__proto__&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;boxPrototype&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;__proto__&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;boxPrototype&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;__proto__&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;boxPrototype&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;이젠 모든 Box들이 똑같은 함수를 참조하므로, 중복이 없어지고 메모리를 덜 사용할 것입니다.
하지만 Box를 생성할 때 마다 &lt;code&gt;__proto__&lt;/code&gt;를 직접 지정한다는 불편함은 계속 존재합니다.&lt;br&gt;
이럴때, 생성자 함수를 만들고 해당 함수의 &lt;code&gt;프로토타입&lt;/code&gt;에 &lt;code&gt;method&lt;/code&gt; 함수를 추가한다면 더 간단화시킬 수 있습니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 생성자 함수
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Box&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//Box() 생성자로 생성된 인스턴스들은 다음 프로퍼티를 갖습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Box&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;boxes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Box&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;), &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Box&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;), &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Box&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;)];
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;생성자 함수로 생성된 모든 인스턴스&lt;/code&gt;들은 자동으로 &lt;code&gt;생성자 함수&lt;/code&gt;의 &lt;code&gt;prototype&lt;/code&gt; 프로퍼티를 &lt;code&gt;프로토타입&lt;/code&gt;으로 갖습니다. 따라서 &lt;code&gt;프로토타입&lt;/code&gt;에 존재하는 &lt;code&gt;프로퍼티&lt;/code&gt;들을 공유하게 됩니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;box&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Box&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 인스턴스들이 생성 된 후에도 Box.prototype를 수정해 동작을 변경할 수 있습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Box&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getValue&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;box&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;method&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;추가로 &lt;code&gt;Constructor.prototype&lt;/code&gt;(&lt;code&gt;Constructor&lt;/code&gt;는 생성자 함수, 여기서는 &lt;code&gt;Box&lt;/code&gt;)는 모든 인스턴스들의 &lt;code&gt;prototype&lt;/code&gt;과 동일한 객체를 참조하므로, &lt;code&gt;Constructor.prototype&lt;/code&gt;을 수정해 해당 &lt;strong&gt;인스턴스들의 동작을 변경&lt;/strong&gt;할 수도 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;다만 이러한 행위를 할 경우, &lt;code&gt;재할당 이전에 생성된 인스턴스들의 프로토타입&lt;/code&gt;과 &lt;code&gt;재할당 이후에 생성된 인스턴스들의 프로토타입&lt;/code&gt;이 다른 객체를 가리키게 되고, &lt;code&gt;constructor&lt;/code&gt; 프로퍼티를 명시적으로 재설정하지 않을 경우 인스턴스에서 이를 추적할 수 없게 되는 단점이 있어 &lt;strong&gt;권장되지 않습니다&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Box&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;constructor&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ƒ Box(value) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//   this.value = value;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;getOwnPropertyNames&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Box&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// (2) [&amp;#39;constructor&amp;#39;, &amp;#39;method&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;그리고 &lt;code&gt;Constructor.prototype&lt;/code&gt;에는 생성자 함수 자체를 참조하는 &lt;code&gt;constructor&lt;/code&gt;라는 프로퍼티가 존재합니다.&lt;br&gt;
이를 통해 해당 생성자 함수로 생성된 모든 인스턴스에서 원래 생성자 함수를 접근할 수 있습니다.&lt;/p&gt;
&lt;h5 id=&#34;주의사항&#34; &gt;주의사항
&lt;span&gt;
    &lt;a href=&#34;#%ec%a3%bc%ec%9d%98%ec%82%ac%ed%95%ad&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;WrongBox&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {&lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;WrongBox&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;method1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;value&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;WrongBox&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;method2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;abcd&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;WrongBox&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;abcd&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;method1&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// TypeError: abcd.method1 is not a function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;추가로, &lt;code&gt;생성자 함수&lt;/code&gt;가 &lt;code&gt;원시 타입이 아닌 값&lt;/code&gt;을 반환할 경우, 해당 값이 &lt;code&gt;new&lt;/code&gt; 표현식의 결과가 됩니다.&lt;br&gt;
따라서 이러한 경우 &lt;code&gt;prototype&lt;/code&gt;이 올바르게 바인딩 되지 않을 수 있습니다.&lt;/p&gt;
&lt;h4 id=&#34;리터럴의-암시적-생성자&#34; &gt;리터럴의 암시적 생성자
&lt;span&gt;
    &lt;a href=&#34;#%eb%a6%ac%ed%84%b0%eb%9f%b4%ec%9d%98-%ec%95%94%ec%8b%9c%ec%a0%81-%ec%83%9d%ec%84%b1%ec%9e%90&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;자바스크립트에서 몇몇 리터럴 구문은 인스턴스의 &lt;code&gt;prototype&lt;/code&gt;을 암시적으로 설정해 생성합니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 객체 리터럴(`__proto__` 프로퍼티를 기입하지 않은)은 자동으로 `Object.prototype`을 프로토타입으로 갖습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;object&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;getPrototypeOf&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;object&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 배열 리터럴은 자동으로 `Array.prototype`을 프로토타입으로 갖습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;array&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;getPrototypeOf&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;array&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; Array.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 정규식 리터럴은 자동으로 `RegExp.prototype`을 프로토타입으로 갖습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;regexp&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/abc/&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;getPrototypeOf&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;regexp&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; RegExp.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;추가로, 일부 빌트-인 생성자의 &lt;code&gt;prototype&lt;/code&gt; 프로퍼티는 그들 스스로의 인스턴스를 가리킵니다.
예를 들어 &lt;code&gt;Number.prototype&lt;/code&gt;는 숫자 0을, &lt;code&gt;Array.prototype&lt;/code&gt;은 빈 배열을, &lt;code&gt;RegExp.prototype&lt;/code&gt;은 &lt;code&gt;/(?:)/&lt;/code&gt;을 가리킵니다.&lt;/p&gt;
&lt;h4 id=&#34;생성자-함수의-프로토타입-체인&#34; &gt;생성자 함수의 프로토타입 체인
&lt;span&gt;
    &lt;a href=&#34;#%ec%83%9d%ec%84%b1%ec%9e%90-%ed%95%a8%ec%88%98%ec%9d%98-%ed%94%84%eb%a1%9c%ed%86%a0%ed%83%80%ec%9e%85-%ec%b2%b4%ec%9d%b8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;생성자 함수로 생성된 인스턴스는 &lt;code&gt;Constructor.prototype&lt;/code&gt;을 프로토타입으로 갖고, &lt;code&gt;Constructor.prototype&lt;/code&gt;은 순수 객체이므로 다음과 같은 &lt;code&gt;프로토타입 체인&lt;/code&gt;을 구성하게 됩니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Constructor&lt;/span&gt;() {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Constructor&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// obj ---&amp;gt; Constructor.prototype ---&amp;gt; Object.prototype ---&amp;gt; null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;만약 &lt;code&gt;Constructor&lt;/code&gt; 함수의 프로토타입으로 다른 함수의 프로토타입을 연결한다면, 프로토타입 체인은 더 길어집니다. 이는 Class에서의 &lt;code&gt;extends&lt;/code&gt; 구문와 유사합니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Constructor&lt;/span&gt;() {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Extender&lt;/span&gt;() {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;setPrototypeOf&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Constructor&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;Extender&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Constructor&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// obj ---&amp;gt; Constructor.prototype ---&amp;gt; Extender.prototype ---&amp;gt; Object.prototype ---&amp;gt; null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;프로토타입-접근-및-설정&#34; &gt;프로토타입 접근 및 설정
&lt;span&gt;
    &lt;a href=&#34;#%ed%94%84%eb%a1%9c%ed%86%a0%ed%83%80%ec%9e%85-%ec%a0%91%ea%b7%bc-%eb%b0%8f-%ec%84%a4%ec%a0%95&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;h4 id=&#34;구문-생성자을-통한-객체-생성&#34; &gt;구문 생성자을 통한 객체 생성
&lt;span&gt;
    &lt;a href=&#34;#%ea%b5%ac%eb%ac%b8-%ec%83%9d%ec%84%b1%ec%9e%90%ec%9d%84-%ed%86%b5%ed%95%9c-%ea%b0%9d%ec%b2%b4-%ec%83%9d%ec%84%b1&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;o&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;p&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;__proto__&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;o&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 위처럼 객체 리터럴 이니셜라이저에서 __proto__ 프로퍼티를 통해 프로토타입을 지정하는 방식이
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// `Object.prototype.__proto__` 을 사용하는 것보다 표준화 및 최적화 되어있습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;중괄호(&lt;code&gt;{}&lt;/code&gt;)로 묶인 &lt;code&gt;프로퍼티 이름-값 쌍&lt;/code&gt; 목록인 &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer&#34;&gt;객체 이니셜라이저&lt;/a&gt;에서 &lt;code&gt;__proto__&lt;/code&gt; 프로퍼티를 통해 프로토타입을 지정하는 방식입니다.&lt;br&gt;
이때 &lt;code&gt;__proto__&lt;/code&gt; 프로퍼티가 객체가 아닌 값을 가리킬 경우 별도의 &lt;code&gt;Exception&lt;/code&gt; 없이 프로토타입 연결에 실패합니다.&lt;/p&gt;
&lt;h4 id=&#34;생성자-함수를-통한-객체-생성&#34; &gt;생성자 함수를 통한 객체 생성
&lt;span&gt;
    &lt;a href=&#34;#%ec%83%9d%ec%84%b1%ec%9e%90-%ed%95%a8%ec%88%98%eb%a5%bc-%ed%86%b5%ed%95%9c-%ea%b0%9d%ec%b2%b4-%ec%83%9d%ec%84%b1&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Graph&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;vertices&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;edges&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Graph&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;prototype&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;addVertex&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;vertices&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;push&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;v&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;g&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Graph&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;생성자 함수는 초기 자바스크립트부터 사용되었기 때문에 표준적이고, JIT 최적화가 가능하다는 장점이 있습니다.&lt;br&gt;
하지만, 이 방식으로 추가된 메서드는 &lt;code&gt;열거 가능(enumerable)&lt;/code&gt;하므로 클래스 구문 또는 빌트-인 메서드의 동작 방식과 일치하지 않아 정상 동작하지 않을 수 있습니다.&lt;/p&gt;
&lt;h4 id=&#34;objectcreate를-통한-객체&#34; &gt;&lt;code&gt;Object.create()&lt;/code&gt;를 통한 객체
&lt;span&gt;
    &lt;a href=&#34;#objectcreate%eb%a5%bc-%ed%86%b5%ed%95%9c-%ea%b0%9d%ec%b2%b4&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// a ---&amp;gt; Object.prototype ---&amp;gt; null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// b ---&amp;gt; a ---&amp;gt; Object.prototype ---&amp;gt; null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// 1 (상속된 값)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// c ---&amp;gt; b ---&amp;gt; a ---&amp;gt; Object.prototype ---&amp;gt; null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt;, { &lt;span style=&#34;color:#a6e22e&#34;&gt;abc&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Object.create()&lt;/code&gt; 함수를 통해 객체를 생성할 경우, 해당 함수에 &lt;code&gt;첫 번째로 넘겨진 인수&lt;/code&gt;가 &lt;code&gt;생성된 객체의 프로토타입&lt;/code&gt;으로 지정됩니다.&lt;br&gt;
참고로 &lt;code&gt;두 번째 인자&lt;/code&gt;를 사용하면 생성될 새로운 객체의 각 속성 값을 정확히 지정할 수 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이는 &lt;code&gt;객체 리터럴&lt;/code&gt;에서 불가능한 &lt;code&gt;열거할 수 없는 프로퍼티&lt;/code&gt; 생성을 할 수 있지만, &lt;code&gt;객체 리터럴&lt;/code&gt;보다 오류가 발생하기 쉽고 느릴 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;클래스를-통한-객체-생성&#34; &gt;클래스를 통한 객체 생성
&lt;span&gt;
    &lt;a href=&#34;#%ed%81%b4%eb%9e%98%ec%8a%a4%eb%a5%bc-%ed%86%b5%ed%95%9c-%ea%b0%9d%ec%b2%b4-%ec%83%9d%ec%84%b1&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Rectangle&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;constructor&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;height&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;width&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Rectangle&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;height&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;height&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;width&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;width&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FilledRectangle&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Rectangle&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;constructor&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;height&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;width&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;color&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;super&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;height&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;width&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Filled rectangle&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;color&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;color&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;filledRectangle&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FilledRectangle&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;blue&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// filledRectangle ---&amp;gt; FilledRectangle.prototype ---&amp;gt; Rectangle.prototype ---&amp;gt; Object.prototype ---&amp;gt; null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;높은 가독성과 유지보수성을 제공하는 클래스 구조는 프로토타입 상속에서는 존재하지 않는 &lt;code&gt;개인 속성(Private property)&lt;/code&gt;을 갖고 있지만, &lt;code&gt;전통적인 생성자 함수&lt;/code&gt;에 비해 &lt;strong&gt;덜 최적화&lt;/strong&gt; 되어있고 &lt;strong&gt;ES6에 이르러서야 등장&lt;/strong&gt;했기 때문에 &lt;strong&gt;이전 환경과 호환되지 않을 수 있습니다&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;개인 속성(Private property)&lt;/code&gt;: 접두어 &lt;code&gt;#&lt;/code&gt;로 시작하는 프로퍼티로, 클래스 외부에서 합법적으로 참조할 수 없는 프로퍼티입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;objectsetgetprototypeof를-사용한-프로토타입-지정-및-접근&#34; &gt;&lt;code&gt;Object.set/getPrototypeOf()&lt;/code&gt;를 사용한 프로토타입 지정 및 접근
&lt;span&gt;
    &lt;a href=&#34;#objectsetgetprototypeof%eb%a5%bc-%ec%82%ac%ec%9a%a9%ed%95%9c-%ed%94%84%eb%a1%9c%ed%86%a0%ed%83%80%ec%9e%85-%ec%a7%80%ec%a0%95-%eb%b0%8f-%ec%a0%91%ea%b7%bc&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;anotherObj&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// obj의 프로토타입을 anotherObj로 설정
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;setPrototypeOf&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;anotherObj&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// obj ---&amp;gt; anotherObj ---&amp;gt; Object.prototype ---&amp;gt; null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;getPrototypeOf&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;anotherObj&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;// {b: 2} &amp;lt;&amp;lt; anotherObj
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Object&lt;/code&gt;에 존재하는 정적 메서드인 &lt;code&gt;setPrototypeOf(obj, prototype)&lt;/code&gt; 함수와 &lt;code&gt;getPrototypeOf(obj)&lt;/code&gt; 함수를 통해 특정 객체의 프로토타입을 설정하거나, 가져올 수 있습니다.&lt;br&gt;
대부분의 JS 엔진은 &lt;code&gt;프로토타입&lt;/code&gt;을 &lt;strong&gt;동적으로 수정&lt;/strong&gt;시 &lt;code&gt;프로토타입 체인&lt;/code&gt;에 적용된 최적화가 중단될 수 있기 때문에, 가능한 생성 중에 프로토타입을 설정하는 것이 좋습니다.&lt;/p&gt;
&lt;h4 id=&#34;__proto__-접근자를-사용한-프로토타입-지정-및-접근&#34; &gt;&lt;code&gt;__proto__&lt;/code&gt; 접근자를 사용한 프로토타입 지정 및 접근
&lt;span&gt;
    &lt;a href=&#34;#__proto__-%ec%a0%91%ea%b7%bc%ec%9e%90%eb%a5%bc-%ec%82%ac%ec%9a%a9%ed%95%9c-%ed%94%84%eb%a1%9c%ed%86%a0%ed%83%80%ec%9e%85-%ec%a7%80%ec%a0%95-%eb%b0%8f-%ec%a0%91%ea%b7%bc&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;blockquote&gt;
&lt;p&gt;주의: &lt;code&gt;Object.prototype.__proto__&lt;/code&gt;는 &lt;strong&gt;표준이 아니며&lt;/strong&gt;, 많은 JS 엔진에서 구현하고 있긴 하지만 &lt;strong&gt;Deprecated&lt;/strong&gt; 되어있으므로 &lt;code&gt;setPrototypeOf&lt;/code&gt; 또는 &lt;code&gt;getPrototypeOf&lt;/code&gt;를 사용하는 것이 권장됩니다. &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto&#34;&gt;#&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;__proto__&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;barProp&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bar val&amp;#34;&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;obj&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;__proto__&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// {barProp: &amp;#39;bar val&amp;#39;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;성능-관련&#34; &gt;성능 관련
&lt;span&gt;
    &lt;a href=&#34;#%ec%84%b1%eb%8a%a5-%ea%b4%80%eb%a0%a8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;프로퍼티 순회 및 조회시 다음과 같이 동작하기 때문에, 성능을 고려해 코드를 작성하는게 좋습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;존재하지 않는 프로퍼티에 접근하려 하면 항상 &lt;code&gt;프로토타입 체인&lt;/code&gt; 전체를 순회하게 됩니다.&lt;/li&gt;
&lt;li&gt;객체의 프로퍼티들을 순회할 때, 모든 &lt;code&gt;열거 가능한 프로퍼티&lt;/code&gt;들이 열거됩니다.&lt;/li&gt;
&lt;li&gt;프로퍼티를 &lt;code&gt;전체 프로토타입 체인&lt;/code&gt;이 아닌, &lt;code&gt;자체 프로퍼티&lt;/code&gt;에서 찾고 싶다면 &lt;code&gt;Object.hasOwn()&lt;/code&gt; 메서드를 사용해야 합니다.(&lt;code&gt;Object.prototype.hasOwnProperty&lt;/code&gt; 가 아닌)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;null&lt;/code&gt;이 프로토타입으로 지정되어 있지 않고, 프로토타입 체인 아래로 재정의되지 않은 경우, 모든 객체는 &lt;code&gt;Object.prototype&lt;/code&gt;의 &lt;code&gt;hasOwnProperty()&lt;/code&gt;를 상속받습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;class와-prototype&#34; &gt;&lt;code&gt;class&lt;/code&gt;와 &lt;code&gt;prototype&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#class%ec%99%80-prototype&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;자바스크립트에서 &lt;code&gt;클래스&lt;/code&gt;가 구현되는 방식 역시 &lt;code&gt;프로토타입 모델&lt;/code&gt;을 기반으로 하고 있으며, &lt;code&gt;클래스&lt;/code&gt;는 &lt;code&gt;프로토타입&lt;/code&gt;을 추상화합니다.&lt;br&gt;
즉, 기존에 존재하는 프로토타입-기반 상속의 &lt;code&gt;문법적 설탕(Syntactical Sugar)&lt;/code&gt;이라고 할 수 있습니다. 다만, &lt;code&gt;클래스에서만 사용할 수 있는&lt;/code&gt; 구문도 존재하는데, &lt;code&gt;static 프로퍼티 및 메서드&lt;/code&gt;, &lt;code&gt;Private Property&lt;/code&gt;과 같은 문법이 바로 그것입니다.&lt;/p&gt;
&lt;h3 id=&#34;class와-생성자-함수&#34; &gt;&lt;code&gt;class&lt;/code&gt;와 &lt;code&gt;생성자 함수&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#class%ec%99%80-%ec%83%9d%ec%84%b1%ec%9e%90-%ed%95%a8%ec%88%98&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;또한 클래스와 생성자 함수 역시 종종 비교되는데, &lt;code&gt;클래스&lt;/code&gt;가 실제로는 &lt;code&gt;런타임 시간&lt;/code&gt;에 &lt;code&gt;생성자 함수&lt;/code&gt;로 동작하기 때문입니다.&lt;br&gt;
심지어 &lt;code&gt;prototype&lt;/code&gt;과 달리, &lt;code&gt;생성자 함수&lt;/code&gt;도 &lt;code&gt;static 프로퍼티 및 메서드&lt;/code&gt;, &lt;code&gt;Private Property&lt;/code&gt;를 가질 수 있습니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// 클래스의 스태틱 메서드
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;greetStatic&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Static hello!&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// 클래스의 프라이빗 프로퍼티와 해당 값을 접근하는 getter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;privateField&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;getField&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;privateField&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FuncPerson&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// 생성자 함수의 프라이빗 프로퍼티
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;privateField&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// 프라이빗 프로퍼티를 접근하는 getter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getField&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () { &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;privateField&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 생성자 함수의 스태틱 함수
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;FuncPerson&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;greetStatic&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () { &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Static Hello!&amp;#39;&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;greetStatic&lt;/span&gt;()); &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#34;Static hello!&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;FuncPerson&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;greetStatic&lt;/span&gt;()); &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;#34;Static hello!&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;getField&lt;/span&gt;()); &lt;span style=&#34;color:#75715e&#34;&gt;// 20
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FuncPerson&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;getField&lt;/span&gt;()) &lt;span style=&#34;color:#75715e&#34;&gt;// 20
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;따라서 자바스크립트의 &lt;code&gt;클래스&lt;/code&gt;는 &lt;code&gt;생성자 함수&lt;/code&gt;와 &lt;code&gt;프로토타입-기반 상속&lt;/code&gt;을 종합한 &lt;code&gt;문법적 설탕&lt;/code&gt;이라 할 수 있습니다.&lt;/p&gt;
&lt;h2 id=&#34;왜-javascript는-프로토타입-기반prototype-based을-채택했을까&#34; &gt;왜 &lt;code&gt;Javascript&lt;/code&gt;는 &lt;code&gt;프로토타입 기반(prototype-based)&lt;/code&gt;을 채택했을까?
&lt;span&gt;
    &lt;a href=&#34;#%ec%99%9c-javascript%eb%8a%94-%ed%94%84%eb%a1%9c%ed%86%a0%ed%83%80%ec%9e%85-%ea%b8%b0%eb%b0%98prototype-based%ec%9d%84-%ec%b1%84%ed%83%9d%ed%96%88%ec%9d%84%ea%b9%8c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;결론부터 말하자면, &lt;code&gt;Javascript&lt;/code&gt;는 &lt;code&gt;Java&lt;/code&gt;의 보조 수단으로써 설계되었기 때문입니다.&lt;br&gt;
넷스케이프에 재직하며, 브라우저인 &lt;code&gt;넷스케이프 네비게이터&lt;/code&gt;에서 사용할 스크립트 언어를 개발을 맡은 &lt;code&gt;브랜든 아이크&lt;/code&gt;는, &lt;code&gt;Scheme&lt;/code&gt; 언어를 브라우저에 구현하라는 지시를 받았었습니다.&lt;br&gt;
하지만 넷스케이프가 웹에서 &lt;code&gt;Java&lt;/code&gt;를 구현하기 위해 &lt;code&gt;썬 마이크로시스템즈&lt;/code&gt;와 계약을 체결하고, 이를 위한 언어인 &lt;code&gt;자바스크립트&lt;/code&gt;(이전에는 &lt;code&gt;Mocha&lt;/code&gt; -&amp;gt; &lt;code&gt;LiveScript&lt;/code&gt;로 이름이 계속 바뀌었다.)를 개발하게 되었습니다.&lt;br&gt;
따라서 Java에 존재하는 &lt;code&gt;Class&lt;/code&gt;를 자바스크립트에 포함하는 것이 허용되지 않았고, 자바스크립트는 이를 대체할 객체 지향 모델이 필요했고 &lt;code&gt;브랜든 아이크&lt;/code&gt;는 프로토타입 기반 상속을 구현했습니다.&lt;br&gt;
이는 &lt;a href=&#34;https://brendaneich.com/2005/06/javascript-1-2-and-in-between/&#34;&gt;브랜든 아이크의 블로그&lt;/a&gt;에 등록된 글 내용에서도 확인할 수 있습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;넷스케이프 2, 3 시절에는 &lt;code&gt;Javascript&lt;/code&gt;를 최소화하고, &lt;code&gt;DOM&lt;/code&gt;을 구현하며 &lt;strong&gt;&amp;ldquo;진짜 프로그래밍&amp;quot;은 Java에 맡겨야 한다&lt;/strong&gt;는 큰 압박을 받았습니다.&lt;br&gt;
(during Netscape 2 and 3 days I was under great pressure to minimize JS-the-language, implement JS-the-DOM, and defer to Java for “real programming” )&lt;br&gt;
(중략)&lt;br&gt;
따라서 &lt;code&gt;Javascript&lt;/code&gt;를 최소화하기 위해, 명시적 &lt;strong&gt;프로토타입-기반 위임&lt;/strong&gt;을 추가해 사용자가 &lt;strong&gt;단일 프로토타입 네임스페이스&lt;/strong&gt;에서 빌트-인 메서드를 자신만의 메서드로 보완할 수 있도록 했습니다.&lt;br&gt;
(Therefore in minimizing JS-the-language, I added explicit prototype-based delegation, allowing users to supplement built-in methods with their own in the same given single-prototype namespace.)&lt;br&gt;
출처: &lt;a href=&#34;https://brendaneich.com/2005/06/javascript-1-2-and-in-between/&#34;&gt;JavaScript 1, 2, and in between – Brendan Eich&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;참조&#34; &gt;참조
&lt;span&gt;
    &lt;a href=&#34;#%ec%b0%b8%ec%a1%b0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://modoocode.com/334&#34;&gt;Rust 의 다형성 - static 과 dynamic dispatch (C++ 을 곁들인..) (modoocode.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain#different_ways_of_creating_and_mutating_prototype_chains&#34;&gt;Inheritance and the prototype chain - JavaScript | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_properties&#34;&gt;Private properties - JavaScript | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static&#34;&gt;static - JavaScript | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://brendaneich.com/2005/06/javascript-1-2-and-in-between/&#34;&gt;JavaScript 1, 2, and in between – Brendan Eich&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>[Javascript] 모듈 시스템들 알아보기</title>
      <link>https://cloudsoswift.github.io/post/develop/javascript/module-system/</link>
      <pubDate>Wed, 03 Jul 2024 14:24:26 +0900</pubDate>
      
      <guid>https://cloudsoswift.github.io/post/develop/javascript/module-system/</guid>
      <description>&lt;h1 id=&#34;서론&#34; &gt;서론
&lt;span&gt;
    &lt;a href=&#34;#%ec%84%9c%eb%a1%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/orm712/CS-712&#34;&gt;CS 스터디&lt;/a&gt;에서 7월 2일 발표한 &lt;a href=&#34;https://github.com/orm712/CS-712/blob/main/08-JAVASCRIPT/4_Module-System/Readme.md&#34;&gt;&lt;strong&gt;모듈 시스템&lt;/strong&gt;&lt;/a&gt;에 대해 정리한 문서를 블로그에 공유하고자 한다.&lt;/p&gt;
&lt;h2 id=&#34;module-in-javascript&#34; &gt;Module in Javascript
&lt;span&gt;
    &lt;a href=&#34;#module-in-javascript&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;Javascript에서 &lt;code&gt;모듈&lt;/code&gt;이란, &lt;em&gt;다른 프로그래밍 언어의 모듈처럼&lt;/em&gt;, 커진 자바스크립트 코드들을 여러 파일로 분리하는 것을 말합니다.&lt;br&gt;
초기에는 자바스크립트 코드들이 &lt;em&gt;크기도 작고 단순한 작업을 수행&lt;/em&gt;했기 때문에 &lt;strong&gt;코드의 분리를 필요로 하지 않았지만&lt;/strong&gt;, 자바스크립트가 &lt;strong&gt;완전한 애플리케이션을 실행&lt;/strong&gt;할 수 있게 되고, 이에 따라 코드의 크기도 커지고 복잡해졌습니다.&lt;br&gt;
특히 기존의 경우, &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 태그를 통해 여러 자바스크립트 파일을 불러올 수 밖에 없었는데, 이들은 전역 네임스페이스를 공유하기 때문에 이전 스크립트의 변수를 뒤집어쓰는 등 혼동을 초래하기 쉬웠습니다.&lt;br&gt;
따라서 이들을 보완하고자, 자바스크립트를 모듈화 하는 방법에 대해 여러 매커니즘이 등장하게 되었습니다.&lt;br&gt;
이러한 모듈 시스템으로는 주로 &lt;code&gt;AMD&lt;/code&gt;, &lt;code&gt;CommonJS&lt;/code&gt;, &lt;code&gt;UMD&lt;/code&gt;, &lt;code&gt;ESM&lt;/code&gt; 4개의 시스템이 주로 사용됩니다.&lt;br&gt;
상세하게는, &lt;code&gt;AMD&lt;/code&gt;, &lt;code&gt;CommonJS&lt;/code&gt;, &lt;code&gt;UMD&lt;/code&gt;와 같은 비표준 시스템이 등장해 사용되다가, &lt;code&gt;ES2015(ES6)&lt;/code&gt;에 &lt;code&gt;ESM(ES Modules)&lt;/code&gt;가 등장하므로써 모듈 시스템이 표준으로 자리잡게 되었습니다.&lt;br&gt;
2018년 Firefox 60이 등장한 이후, &lt;strong&gt;모든 주요 브라우저&lt;/strong&gt;들은 &lt;strong&gt;&lt;code&gt;ES Module&lt;/code&gt;을 지원&lt;/strong&gt;하게 되었으며 &lt;code&gt;CommonJS&lt;/code&gt;를 기본적으로 지원하는 &lt;code&gt;Node.js&lt;/code&gt; 역시 &lt;strong&gt;12버전&lt;/strong&gt; 부터 &lt;code&gt;ESM&lt;/code&gt;를 지원하기 시작했으며, 현재 &lt;code&gt;완전한 지원(fully-support)&lt;/code&gt;을 제공하고 있습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Node.js fully supports ECMAScript modules as they are currently specified and provides interoperability between them and its original module format, &lt;a href=&#34;https://nodejs.org/api/modules.html&#34;&gt;CommonJS&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://nodejs.org/api/esm.html&#34;&gt;Modules: ECMAScript modules | Node.js v22.3.0 Documentation (nodejs.org)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;amd&#34; &gt;&lt;code&gt;AMD&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#amd&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Asynchronous module definition(비동기 모듈 정의)&lt;/code&gt;, 줄여서 &lt;code&gt;AMD&lt;/code&gt;란 &lt;code&gt;비동기&lt;/code&gt;적으로 모듈과 그 종속성을 불러올 수 있도록 모듈을 정의하는 메커니즘을 말합니다.&lt;br&gt;
&lt;img src=&#34;AMD-Loading.png&#34; alt=&#34;AMD-Loading.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;위 그림처럼, AMD 방식은 불러올 파일들 간에 종속성이 존재하더라도 이들을 순서대로 로딩하지 않고 모두 개별적으로 로딩할 수 있습니다.&lt;br&gt;
&lt;code&gt;AMD&lt;/code&gt;는 전역 변수(또는 &lt;code&gt;자유 변수&lt;/code&gt;)로 사용할 수 있는 함수인 &lt;code&gt;define()&lt;/code&gt;과, &lt;code&gt;CommonJS&lt;/code&gt;와의 상호운용성을 제공하기 위해 유사한 형태의 &lt;code&gt;exports&lt;/code&gt;와 &lt;code&gt;require()&lt;/code&gt; 인터페이스를 제공합니다. (다만, 보통 &lt;code&gt;define()&lt;/code&gt;을 사용하는 것이 더 선호됩니다.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;자유 변수&lt;/code&gt;: 함수에 사용되는 변수 중 &lt;strong&gt;지역 변수&lt;/strong&gt; 또는 &lt;strong&gt;해당 함수의 매개 변수&lt;/strong&gt;가 &lt;strong&gt;아닌&lt;/strong&gt; 변수를 의미합니다.&lt;br&gt;
알려진 &lt;code&gt;AMD&lt;/code&gt; 구현체로는 &lt;a href=&#34;https://dojotoolkit.org/&#34;&gt;Dojo Toolkit&lt;/a&gt;, &lt;a href=&#34;https://requirejs.org/&#34;&gt;RequireJS&lt;/a&gt; 등이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;api-사양-httpsgithubcomamdjsamdjs-apiwikiamd&#34; &gt;API 사양 &lt;a href=&#34;https://github.com/amdjs/amdjs-api/wiki/AMD&#34;&gt;#&lt;/a&gt;
&lt;span&gt;
    &lt;a href=&#34;#api-%ec%82%ac%ec%96%91-httpsgithubcomamdjsamdjs-apiwikiamd&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;h5 id=&#34;define-함수&#34; &gt;&lt;code&gt;define()&lt;/code&gt; 함수
&lt;span&gt;
    &lt;a href=&#34;#define-%ed%95%a8%ec%88%98&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;전역변수로 사용할 수 있는 이 함수는 일종의 &lt;strong&gt;네임스페이스 역할&lt;/strong&gt;을 해, 모듈에서 사용하는 변수와 전역 변수를 분리하는 역할을 해주는 함수입니다. 이를 통해 브라우저 환경의 Javascript에는 존재하지 않는 &lt;strong&gt;&lt;code&gt;파일 스코프&lt;/code&gt;를 대신&lt;/strong&gt;할 수 있습니다.&lt;br&gt;
&lt;code&gt;define()&lt;/code&gt; 함수는 다음과 같은 함수 시그니처를 가지며, 각 인수들은 다음을 뜻합니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;define&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;dependencies&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;모듈을 식별&lt;/code&gt;하는데 사용되는 인수로, &lt;code&gt;문자열 리터럴&lt;/code&gt;입니다.&lt;/li&gt;
&lt;li&gt;선택 사항이며, 이 값이 주어지지 않으면 로더가 요청하는 &amp;lt;script&amp;gt; 태그의 src 값(id)를 기본 id로 설정합니다.
&lt;ul&gt;
&lt;li&gt;만약 명시할 경우, 모듈 id는 반드시 &lt;code&gt;최상위&lt;/code&gt; 또는 &lt;code&gt;절대 id(절대 경로)&lt;/code&gt; 여야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;모듈 id&lt;/code&gt;는 정의중인 모듈을 식별하는데 사용할 수 있고, 종속성 배열 인수에도 사용됩니다. &lt;code&gt;AMD&lt;/code&gt;의 &lt;code&gt;모듈 id&lt;/code&gt;는 &lt;a href=&#34;https://wiki.commonjs.org/wiki/Modules/1.1.1#Module_Identifiers&#34;&gt;CommonJS 모듈 식별자에서 허용되는 것&lt;/a&gt;의 상위 집합입니다.
&lt;ul&gt;
&lt;li&gt;모듈 식별자는 &lt;code&gt;/(슬래쉬)&lt;/code&gt;로 구분되는 &lt;code&gt;용어들(terms)&lt;/code&gt;의 문자열입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;용어&lt;/code&gt;는 카멜 케이스 식별자, &lt;code&gt;.&lt;/code&gt; 또는 &lt;code&gt;..&lt;/code&gt; 여야 합니다.&lt;/li&gt;
&lt;li&gt;모듈 식별자는 &lt;code&gt;&amp;quot;.js&amp;quot;&lt;/code&gt;와 같은 파일이름 확장자를 가질 수 없습니다.&lt;/li&gt;
&lt;li&gt;모듈 식별자는 &lt;code&gt;상대적&lt;/code&gt;이거나, &lt;code&gt;최상위&lt;/code&gt; 일 수 있습니다. 만약 첫 번째 용어가 &lt;code&gt;.&lt;/code&gt; 또는 &lt;code&gt;..&lt;/code&gt; 인 경우 &lt;code&gt;상대적&lt;/code&gt;입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;최상위&lt;/code&gt; 식별자는 개념적 모듈 네임스페이스루트에서 확인됩니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;상대적&lt;/code&gt; 식별자는 &lt;code&gt;require&lt;/code&gt; 코드가 작성 및 호출되는 모듈의 식별자를 기준으로 합니다.
&lt;ul&gt;
&lt;li&gt;만약 &lt;code&gt;a/b/c&lt;/code&gt; 모듈이 &lt;code&gt;../d&lt;/code&gt; 모듈을 요청하면, 이는 &lt;code&gt;a/d&lt;/code&gt;로 요청됩니다.&lt;/li&gt;
&lt;li&gt;만약 &lt;code&gt;a/b/c&lt;/code&gt; 모듈이 &lt;code&gt;./e&lt;/code&gt; 모듈을 요청하면, 이는 &lt;code&gt;a/b/e&lt;/code&gt;로 요청됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dependencies&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;현재 정의 중인 모듈에 필요한 의존성&lt;/em&gt;인 &lt;code&gt;모듈 id&lt;/code&gt;의 배열 리터럴입니다.&lt;/li&gt;
&lt;li&gt;이는 모듈 팩토리 함수가 실행되기 전 요청되어야 하며, 요청된 값은 &lt;code&gt;의존성 배열에서의 인덱스&lt;/code&gt;와 &lt;strong&gt;동일한 순서&lt;/strong&gt;로 &lt;code&gt;팩토리 함수의 인자&lt;/code&gt;로 &lt;strong&gt;전달&lt;/strong&gt;되어야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;종속성 모듈 id&lt;/code&gt;는 &lt;code&gt;상대적 id&lt;/code&gt;일 수 있으며, 정의되는 모듈을 기준으로 요청됩니다.&lt;/li&gt;
&lt;li&gt;만약 종속성 목록에 &lt;code&gt;require&lt;/code&gt;, &lt;code&gt;exports&lt;/code&gt;, &lt;code&gt;module&lt;/code&gt; 이라는 값이 등장한다면 이는 &lt;code&gt;CommonJS&lt;/code&gt; 모듈 사양에 정의된 해당 자유 변수로 해석되어야 합니다.&lt;/li&gt;
&lt;li&gt;만약 이를 생략하면, 기본 값은 &lt;code&gt;[&amp;quot;require&amp;quot;, &amp;quot;exports&amp;quot;, &amp;quot;module&amp;quot;]&lt;/code&gt;이 됩니다.
- 그러나 팩토리 함수의 &lt;code&gt;항수(매개변수의 개수)&lt;/code&gt;가 3보다 작은 경우, 로더는 함수의 &lt;code&gt;항수(또는 길이)&lt;/code&gt;에 해당하는 수의 인수만 사용해 팩토리 함수를 호출하도록 선택할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;factory&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;모듈 또는 객체를 인스턴스화하기위해 실행해야 하는 함수입니다.&lt;/li&gt;
&lt;li&gt;만약 &lt;code&gt;factory&lt;/code&gt;가 함수라면 &lt;code&gt;싱글톤&lt;/code&gt;으로 한 번만 실행되며, 객체인 경우 해당 객체를 모듈의 &lt;code&gt;exports&lt;/code&gt; 객체의 속성값으로 할당합니다.
&lt;ul&gt;
&lt;li&gt;만약 &lt;code&gt;factory&lt;/code&gt; 함수가 값(&lt;code&gt;객체&lt;/code&gt;, &lt;code&gt;함수&lt;/code&gt;, 또는 &lt;code&gt;true로 인식되는 모든 값&lt;/code&gt;)을 반환할 경우, 이 역시 해당 값을 &lt;code&gt;exports&lt;/code&gt; 객체의 속성값으로 할당합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;defineamd-프로퍼티&#34; &gt;&lt;code&gt;define.amd&lt;/code&gt; 프로퍼티
&lt;span&gt;
    &lt;a href=&#34;#defineamd-%ed%94%84%eb%a1%9c%ed%8d%bc%ed%8b%b0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;&lt;code&gt;&amp;lt;script&amp;gt; src&lt;/code&gt; 브라우저 로딩에 필요한 전역 &lt;code&gt;define&lt;/code&gt; 함수가 &lt;code&gt;AMD&lt;/code&gt; API를 준수한다는 표시를 하기 위해, 모든 전역 &lt;code&gt;define&lt;/code&gt; 함수는 값이 객체인 &lt;strong&gt;&lt;code&gt;amd&lt;/code&gt; 라는 프로퍼티&lt;/strong&gt;를 갖고 있어야 합니다.&lt;br&gt;
이는 &lt;code&gt;AMD&lt;/code&gt; API를 준수하지 않는 &lt;code&gt;define&lt;/code&gt; 함수를 정의하는 다른 코드와의 충돌을 막을 수 있습니다.&lt;br&gt;
&lt;code&gt;define.amd&lt;/code&gt;객체 내부의 속성은 지정되어 있지 않기 때문에, &lt;code&gt;AMD&lt;/code&gt; 로더 구현체에 따라 해당 객체 내부의 프로퍼티를 활용해 여러 기능들을 추가할 수 있습니다.&lt;/p&gt;
&lt;h4 id=&#34;예시-코드&#34; &gt;예시 코드
&lt;span&gt;
    &lt;a href=&#34;#%ec%98%88%ec%8b%9c-%ec%bd%94%eb%93%9c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;define&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;alpha&amp;#34;&lt;/span&gt;, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;require&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;exports&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;beta&amp;#34;&lt;/span&gt;], &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;exports&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;beta&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// 외부에 verb 라는 프로퍼티를 내보냄
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;exports&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;verb&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#75715e&#34;&gt;// 의존성으로 설정된 다른 모듈을 사용하려면
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		&lt;span style=&#34;color:#75715e&#34;&gt;// 넘겨받는 인수를 사용하거나,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;beta&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;verb&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#75715e&#34;&gt;// 또는 require()를 이용해
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		&lt;span style=&#34;color:#75715e&#34;&gt;// 얻어 온 모듈을 사용해도 된다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;beta&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;verb&lt;/span&gt;();  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;장점&#34; &gt;장점
&lt;span&gt;
    &lt;a href=&#34;#%ec%9e%a5%ec%a0%90&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;h5 id=&#34;전역변수-문제가-없음&#34; &gt;전역변수 문제가 없음
&lt;span&gt;
    &lt;a href=&#34;#%ec%a0%84%ec%97%ad%eb%b3%80%ec%88%98-%eb%ac%b8%ec%a0%9c%ea%b0%80-%ec%97%86%ec%9d%8c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;&lt;code&gt;define()&lt;/code&gt; 함수를 이용해 모듈을 구현하므로, 즉, 클로저를 사용해 모듈 정의를 캡슐화 하므로 전역 네임스페이스 오염을 방지할 수 있습니다.&lt;/p&gt;
&lt;h5 id=&#34;commonjs와의-상호운용성을-제공함&#34; &gt;&lt;code&gt;CommonJS&lt;/code&gt;와의 상호운용성을 제공함
&lt;span&gt;
    &lt;a href=&#34;#commonjs%ec%99%80%ec%9d%98-%ec%83%81%ed%98%b8%ec%9a%b4%ec%9a%a9%ec%84%b1%ec%9d%84-%ec%a0%9c%ea%b3%b5%ed%95%a8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;h3 id=&#34;commonjs&#34; &gt;&lt;code&gt;CommonJS&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#commonjs&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;CommonJS&lt;/code&gt;란 &lt;a href=&#34;https://www.blueskyonmars.com/2009/01/29/what-server-side-javascript-needs/&#34;&gt;모질라의 Kevin Dangoor에 의해 2009년 시작된&lt;/a&gt;(당시 이름은 &lt;code&gt;ServerJS&lt;/code&gt;), &amp;ldquo;웹 브라우저 외부(특히 웹 서버 등 서버사이드)에서의 Javascript용 모듈 생태계를 표준화하기 위한 명세&amp;quot;를 포함한 프로젝트를 말합니다.&lt;br&gt;
&lt;code&gt;웹 브라우저 외부(특히 서버사이드)&lt;/code&gt;에서의 &lt;strong&gt;사용을 목표&lt;/strong&gt;로 했기 때문에, &lt;code&gt;Node.js&lt;/code&gt;와 같은 런타임에서 &lt;a href=&#34;https://nodejs.org/api/modules.html&#34;&gt;채택해 사용 중&lt;/a&gt;입니다.&lt;/p&gt;
&lt;h4 id=&#34;특징&#34; &gt;특징
&lt;span&gt;
    &lt;a href=&#34;#%ed%8a%b9%ec%a7%95&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CommonJS&lt;/code&gt;는 &lt;code&gt;동기식&lt;/code&gt; &lt;strong&gt;모듈 시스템&lt;/strong&gt;이기 때문에, 특정 모듈을 &lt;code&gt;import&lt;/code&gt;한 경우 &lt;em&gt;해당 모듈이 로드될 때 까지&lt;/em&gt; &lt;strong&gt;코드 실행이 중단&lt;/strong&gt;됩니다.&lt;/li&gt;
&lt;li&gt;모듈을 가져오기 위해 &lt;code&gt;require&lt;/code&gt; 함수를, 모듈을 내보내기 위해 &lt;code&gt;module.exports&lt;/code&gt; 객체를 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;api-명세-httpswikicommonjsorgwikimodules111&#34; &gt;API 명세 &lt;a href=&#34;https://wiki.commonjs.org/wiki/Modules/1.1.1&#34;&gt;#&lt;/a&gt;
&lt;span&gt;
    &lt;a href=&#34;#api-%eb%aa%85%ec%84%b8-httpswikicommonjsorgwikimodules111&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;앞서 설명한 것 처럼, CommonJS에서 모듈을 불러오고, 내보내기 위해 &lt;code&gt;require()&lt;/code&gt;  함수와 &lt;code&gt;module.exports&lt;/code&gt; 객체를 사용합니다.&lt;br&gt;
&lt;a href=&#34;https://wiki.commonjs.org/wiki/Modules/1.1.1&#34;&gt;API 명세&lt;/a&gt;에는 이들에 대해 다음과 같은 계약이 명시되어 있으며, &lt;code&gt;CommonJS&lt;/code&gt; 구현체들은 이를 지켜야 합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;require&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;require()&lt;/code&gt; 함수는 &lt;code&gt;모듈 식별자(id)&lt;/code&gt;를 인자로 받으며, 해당 모듈이 &lt;code&gt;내보낸 API&lt;/code&gt;를 반환합니다.&lt;/li&gt;
&lt;li&gt;만약 &lt;code&gt;의존성 사이클&lt;/code&gt;이 존재할 경우, 외부 모듈이 &lt;code&gt;전이적 의존성&lt;/code&gt; 중 하나에 의해 &lt;code&gt;require&lt;/code&gt; 될 때 실행이 완료되지 않았을 수 있습니다.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;전이적 의존성&lt;/code&gt;: A가 B를 의존하고, B가 C를 의존할 경우 C는 A의 전이적 의존성이다.&lt;/li&gt;
&lt;li&gt;이 경우, &lt;code&gt;require&lt;/code&gt;가 반환하는 객체에는 현재 모듈의 실행을 유도한 &lt;code&gt;require&lt;/code&gt;의 실행 이전에 준비된 하나 이상의 &lt;code&gt;exports&lt;/code&gt;를 포함해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;요청된 모듈이 반환될 수 없으면, &lt;code&gt;require&lt;/code&gt;는 에러를 던져야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;require&lt;/code&gt; 함수는 &lt;code&gt;main&lt;/code&gt; 프로퍼티를 가질 수 있으며, 이는 &lt;code&gt;undefined&lt;/code&gt; 이거나 로드된 모듈의 &lt;code&gt;module&lt;/code&gt; 객체와 동일해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;require&lt;/code&gt; 함수는 &lt;code&gt;paths&lt;/code&gt; 속성을 가질 수 있으며, 이는 최상위 모듈 디렉토리 까지의 경로를 우선순위대로 배열한 문자열 배열입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;module&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;module&lt;/code&gt; 컨텍스트 안에는 위 정의를 따르는 자유 변수인 &lt;code&gt;require&lt;/code&gt;가 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;module&lt;/code&gt; 컨텍스트 안에는 모듈이 실행될 때 API를 추가할 수 있는 객체인 자유 변수 &lt;code&gt;exports&lt;/code&gt;가 있습니다.
&lt;ul&gt;
&lt;li&gt;모듈은 &lt;code&gt;exports&lt;/code&gt;를 &lt;strong&gt;유일한 내보내기 수단&lt;/strong&gt;으로 사용해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;module&lt;/code&gt; 안에는 &lt;code&gt;module&lt;/code&gt;이라는 객체인 자유 변수가 존재해야 합니다.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;module&lt;/code&gt; 객체는 모듈의 최상위 식별자인 &lt;code&gt;id&lt;/code&gt; 프로퍼티를 갖고 있어야 합니다.
&lt;ul&gt;
&lt;li&gt;또한 이 &lt;code&gt;id&lt;/code&gt; 프로퍼티를 사용해 &lt;code&gt;require(module.id)&lt;/code&gt;를 호출한 경우, &lt;code&gt;module.id&lt;/code&gt;의 출처가 된 &lt;code&gt;exports&lt;/code&gt; 객체를 반환해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;module&lt;/code&gt; 객체는 &lt;em&gt;모듈이 생성된 리소스에 대한 정규화된 URI&lt;/em&gt;인 &lt;code&gt;uri&lt;/code&gt; 문자열이 있을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;예시-코드-1&#34; &gt;예시 코드
&lt;span&gt;
    &lt;a href=&#34;#%ec%98%88%ec%8b%9c-%ec%bd%94%eb%93%9c-1&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// customers.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;customers&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Rachel&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Galen&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Charles&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 해당 모듈에서 내보내고자 하는 것들을 `exports`에 담아줍니다. 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// exports에 포함되지 않은 지역 변수는 외부에서 접근할 수 없습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;module&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;exports&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;getCustomers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;users&lt;/span&gt;   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;sortCustomers&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;users&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;()   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;firstCustomer&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;users&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// acounting.js  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;customers&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./customers&amp;#39;&lt;/span&gt;)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;customers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getCustomers&lt;/span&gt;() &lt;span style=&#34;color:#75715e&#34;&gt;// [&amp;#34;Rachel&amp;#34;, &amp;#34;Galen&amp;#34;, &amp;#34;Charles&amp;#34;]  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;customers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;sortCustomers&lt;/span&gt;() &lt;span style=&#34;color:#75715e&#34;&gt;// [&amp;#34;Charles&amp;#34;, &amp;#34;Galen&amp;#34;, &amp;#34;Rachel&amp;#34;]  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;customers&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;firsCustomer&lt;/span&gt;() &lt;span style=&#34;color:#75715e&#34;&gt;// [&amp;#34;Charles&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;장점-1&#34; &gt;장점
&lt;span&gt;
    &lt;a href=&#34;#%ec%9e%a5%ec%a0%90-1&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;h5 id=&#34;배우고-사용하기-쉬움&#34; &gt;배우고 사용하기 쉬움
&lt;span&gt;
    &lt;a href=&#34;#%eb%b0%b0%ec%9a%b0%ea%b3%a0-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0-%ec%89%ac%ec%9b%80&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;h5 id=&#34;nodejs에서-널리-사용됨&#34; &gt;&lt;code&gt;Node.js&lt;/code&gt;에서 널리 사용됨
&lt;span&gt;
    &lt;a href=&#34;#nodejs%ec%97%90%ec%84%9c-%eb%84%90%eb%a6%ac-%ec%82%ac%ec%9a%a9%eb%90%a8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;h5 id=&#34;동기식이기-때문에-모듈-실행-전-모든-종속성이-로드됨을-보장함&#34; &gt;동기식이기 때문에, 모듈 실행 전 모든 종속성이 로드됨을 보장함
&lt;span&gt;
    &lt;a href=&#34;#%eb%8f%99%ea%b8%b0%ec%8b%9d%ec%9d%b4%ea%b8%b0-%eb%95%8c%eb%ac%b8%ec%97%90-%eb%aa%a8%eb%93%88-%ec%8b%a4%ed%96%89-%ec%a0%84-%eb%aa%a8%eb%93%a0-%ec%a2%85%ec%86%8d%ec%84%b1%ec%9d%b4-%eb%a1%9c%eb%93%9c%eb%90%a8%ec%9d%84-%eb%b3%b4%ec%9e%a5%ed%95%a8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;h4 id=&#34;단점&#34; &gt;단점
&lt;span&gt;
    &lt;a href=&#34;#%eb%8b%a8%ec%a0%90&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;h5 id=&#34;동기식이기-때문에-대규모-앱에서-성능-문제를-야기할-수-있음&#34; &gt;동기식이기 때문에, 대규모 앱에서 성능 문제를 야기할 수 있음
&lt;span&gt;
    &lt;a href=&#34;#%eb%8f%99%ea%b8%b0%ec%8b%9d%ec%9d%b4%ea%b8%b0-%eb%95%8c%eb%ac%b8%ec%97%90-%eb%8c%80%ea%b7%9c%eb%aa%a8-%ec%95%b1%ec%97%90%ec%84%9c-%ec%84%b1%eb%8a%a5-%eb%ac%b8%ec%a0%9c%eb%a5%bc-%ec%95%bc%ea%b8%b0%ed%95%a0-%ec%88%98-%ec%9e%88%ec%9d%8c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;모든 파일이 로컬 디스크에 있어 필요할 때 바로 불러올 수 있는 상황을 전제, 즉 &lt;em&gt;동기적으로 동작 가능한 Server-side JS 환경&lt;/em&gt;을 전제로 하기 때문입니다.&lt;/p&gt;
&lt;h5 id=&#34;tree-shaking이-없기-때문에-번들-크기가-커질-수-있음&#34; &gt;tree-shaking이 없기 때문에 번들 크기가 커질 수 있음
&lt;span&gt;
    &lt;a href=&#34;#tree-shaking%ec%9d%b4-%ec%97%86%ea%b8%b0-%eb%95%8c%eb%ac%b8%ec%97%90-%eb%b2%88%eb%93%a4-%ed%81%ac%ea%b8%b0%ea%b0%80-%ec%bb%a4%ec%a7%88-%ec%88%98-%ec%9e%88%ec%9d%8c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;h5 id=&#34;브라우저에서-지원하지-않기-때문에-클라이언트-측-개발에-적합하지-않음&#34; &gt;브라우저에서 지원하지 않기 때문에, 클라이언트 측 개발에 적합하지 않음
&lt;span&gt;
    &lt;a href=&#34;#%eb%b8%8c%eb%9d%bc%ec%9a%b0%ec%a0%80%ec%97%90%ec%84%9c-%ec%a7%80%ec%9b%90%ed%95%98%ec%a7%80-%ec%95%8a%ea%b8%b0-%eb%95%8c%eb%ac%b8%ec%97%90-%ed%81%b4%eb%9d%bc%ec%9d%b4%ec%96%b8%ed%8a%b8-%ec%b8%a1-%ea%b0%9c%eb%b0%9c%ec%97%90-%ec%a0%81%ed%95%a9%ed%95%98%ec%a7%80-%ec%95%8a%ec%9d%8c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;만약 브라우저측에서 사용하고 싶다면 트랜스컴파일이 필요합니다.&lt;/p&gt;
&lt;h3 id=&#34;umd&#34; &gt;&lt;code&gt;UMD&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#umd&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Universal Module Definition(범용 모듈 정의)&lt;/code&gt;, 줄여서 &lt;code&gt;UMD&lt;/code&gt;란 모듈 작성 방식이 &lt;strong&gt;CommonJS&lt;/strong&gt;와 &lt;strong&gt;AMD&lt;/strong&gt; 두 방식으로 나누어져서 호환 문제가 발생하자, 이를 해결하기 위해 나온 디자인 패턴입니다.&lt;br&gt;
&lt;code&gt;CommonJS&lt;/code&gt; 방식과 &lt;code&gt;AMD&lt;/code&gt; 방식 모두 사용할 수 있다는 장점이 있기 때문에 여러 모듈 로더에서 사용할 수 있습니다.&lt;/p&gt;
&lt;h4 id=&#34;예시-코드-httpsgithubcomumdjsumdblobmastertemplatescommonjsstrictjsl9&#34; &gt;예시 코드 &lt;a href=&#34;https://github.com/umdjs/umd/blob/master/templates/commonjsStrict.js#L9&#34;&gt;#&lt;/a&gt;
&lt;span&gt;
    &lt;a href=&#34;#%ec%98%88%ec%8b%9c-%ec%bd%94%eb%93%9c-httpsgithubcomumdjsumdblobmastertemplatescommonjsstrictjsl9&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 모듈을 생성하기 위해 CommonJS, AMD, 또는 이외의 브라우저 global을 사용합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 해당 예시는 `b` 라는 모듈을 의존하는 모듈을 불러옵니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 만약 브라우저 전역 경로(global path)를 사용하고 싶지 않다면, 인수로 root 대신 `this`를 넘겨주어야 합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 모듈 로더를 확인하는 IIFE(즉시 실행 함수)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;root&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;define&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;function&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;define&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;amd&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// AMD 방식. 익명 모듈로 등록합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;define&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;exports&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;b&amp;#39;&lt;/span&gt;], &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;exports&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;object&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;exports&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;nodeName&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;string&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// CommonJS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;exports&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;b&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Browser globals
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;factory&lt;/span&gt;((&lt;span style=&#34;color:#a6e22e&#34;&gt;root&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;commonJsStrict&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {}), &lt;span style=&#34;color:#a6e22e&#34;&gt;root&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}(&lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;self&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;undefined&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;self&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;exports&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// Use b in some fashion.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// `exports` 객체에 프로퍼티를 추가해 모듈로 내보낼 프로퍼티들을 정의합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;exports&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;action&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;esm&#34; &gt;&lt;code&gt;ESM&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#esm&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;ECMAScript Module&lt;/code&gt;, 줄여서 &lt;code&gt;ESM&lt;/code&gt;(또는 &lt;code&gt;ES Module&lt;/code&gt;)이란 &lt;code&gt;ECMAScript2015(ES6)&lt;/code&gt;에 도입된 네이티브 모듈 시스템을 말합니다. 즉 Javascript 언어의 일부로 모듈 시스템이 자리잡은 것으로, 웹 브라우저는 물론 Node.js와 같은 런타임에서도 광범위하게 지원되고 있습니다.&lt;br&gt;
&lt;code&gt;ES Module&lt;/code&gt;을 사용하기 위해서는 &lt;code&gt;&amp;lt;script type=&amp;quot;module&amp;quot;&amp;gt;&lt;/code&gt; 로 스크립트를 불러오거나, &lt;em&gt;&lt;code&gt;Node.js&lt;/code&gt;의 경우&lt;/em&gt; &lt;code&gt;package.json&lt;/code&gt; 파일에 &lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;module&amp;quot;&lt;/code&gt; 속성을 추가하거나 파일 확장자를 &lt;code&gt;.mjs&lt;/code&gt;로 설정해야 합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;추가로, 만약 파일 확장자가 &lt;code&gt;.cjs&lt;/code&gt;라면 항상 &lt;code&gt;package&lt;/code&gt; 설정에 상관 없이 &lt;code&gt;CommonJS&lt;/code&gt; 모듈로 취급됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;로드-과정&#34; &gt;로드 과정
&lt;span&gt;
    &lt;a href=&#34;#%eb%a1%9c%eb%93%9c-%ea%b3%bc%ec%a0%95&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;ES Module&lt;/code&gt;은 &lt;code&gt;비동기적&lt;/code&gt;으로 모듈을 불러온다고 알려져 있는데, 이는 &lt;code&gt;ES Module&lt;/code&gt; 을 불러오는 3단계 과정이 개별적으로 될 수 있기 때문입니다.&lt;br&gt;
&lt;a href=&#34;https://tc39.es/ecma262/#table-abstract-methods-of-module-records&#34;&gt;&lt;code&gt;ECMAScript&lt;/code&gt; 명세&lt;/a&gt;에 따르면, 3단계 과정은 다음과 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LoadRequestedModules()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;모든 종속성들을 재귀적으로 로드해 모듈을 &lt;code&gt;연결(Link)&lt;/code&gt;할 준비를 하고, &lt;code&gt;Promise&lt;/code&gt;를 반환합니다.
&lt;ul&gt;
&lt;li&gt;모듈들을 비동기적으로 불러와, &lt;code&gt;모듈 레코드&lt;/code&gt;로 저장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Link()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;모듈의 모든 종속성들을 전이적으로 불러오고, &lt;code&gt;모듈 환경 레코드(Module Environment Record)&lt;/code&gt;를 생성해 모듈을 평가할 수 있도록 준비합니다.
&lt;ul&gt;
&lt;li&gt;모듈의 &lt;code&gt;exports&lt;/code&gt;와 메모리 상의 &lt;code&gt;imports&lt;/code&gt;를 연결합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Evaluate()&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;모듈과 종속성의 평가에 대한 &lt;code&gt;Promise&lt;/code&gt;를 반환합니다. 평가가 성공적으로 이뤄진 경우 &lt;code&gt;resolve&lt;/code&gt;, 에러가 발생한 경우 &lt;code&gt;reject&lt;/code&gt; 합니다. host는 &lt;code&gt;Promise&lt;/code&gt;가 &lt;code&gt;reject&lt;/code&gt;된 경우 평가 에러를 던져야 합니다.
&lt;ul&gt;
&lt;li&gt;코드를 실행해 변수의 실제 값(모듈 레코드)으로 채웁니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;명세-httpsdevelopermozillaorgkodocswebjavascriptguidemodulesimporting_features_into_your_script&#34; &gt;명세 &lt;a href=&#34;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Modules#importing_features_into_your_script&#34;&gt;#&lt;/a&gt;
&lt;span&gt;
    &lt;a href=&#34;#%eb%aa%85%ec%84%b8-httpsdevelopermozillaorgkodocswebjavascriptguidemodulesimporting_features_into_your_script&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;ES Module&lt;/code&gt;은 &lt;code&gt;export&lt;/code&gt; 문을 통해 내보내고, &lt;code&gt;import&lt;/code&gt; 문을 통해 다른 모듈을 불러옵니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;export&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;내보내고 싶은 항목 앞에 export를 배치하거나, 중괄호로 묶어 내보낼 수 있습니다.&lt;/li&gt;
&lt;li&gt;또는 &lt;code&gt;default&lt;/code&gt;로 &lt;code&gt;export&lt;/code&gt;할 수 있는데, 이는 &lt;code&gt;CommonJS&lt;/code&gt;와 &lt;code&gt;AMD&lt;/code&gt; 모듈 시스템과 함께 상호운용하는데 도움이 됩니다.&lt;/li&gt;
&lt;li&gt;또한, &lt;code&gt;as&lt;/code&gt; 키워드를 활용해 새로운 이름으로 내보낼 수도 있습니다.&lt;/li&gt;
&lt;li&gt;추가로, 다른 모듈의 요소들을 불러와 함께 &lt;code&gt;export&lt;/code&gt; 할 수도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 1. 내보내고 싶은 항목 앞에 export 배치
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;square&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 2. 내보내고 싶은 항목들을 중괄호로 묶기
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;draw&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;reportArea&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;reportPerimeter&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 3. 내보내고 싶은 항목을 default로 내보내기
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;randomSquare&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 4. as를 사용해 새로운 이름으로 내보내기
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;function1&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;newFunctionName&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;function2&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;anotherNewFunctionName&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 5. 다른 모듈의 요소들 함께 export 하기
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 현재 모듈과 다른 모듈의 요소들을 함께 내보내고 싶다면 다음과 같이 할 수 있습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; } &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;x.js&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;import&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;불러오고 싶은 모듈의 항목들을 쉼표로 구분해 나열한 뒤 중괄호로 묶어 불러올 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;from&lt;/code&gt;을 통해 모듈 파일 경로를 작성해야 하는데, 전체 절대 경로를 작성하거나, 상대 경로를 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이 역시 &lt;code&gt;export&lt;/code&gt;와 마찬가지로, &lt;code&gt;as&lt;/code&gt; 키워드를 활용해 새로운 이름으로 불러올 수 있습니다.&lt;/li&gt;
&lt;li&gt;추가로, &lt;code&gt;import()&lt;/code&gt; 함수를 통해 모듈을 동적으로 불러올 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 1. 불러오고 싶은 항목들을 지정해 묶어 불러오기
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;draw&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;reportArea&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;reportPerimeter&lt;/span&gt; } &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./modules/square.js&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 2. 모듈 객체로 묶어 불러오기
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Module&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./modules/module.js&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 3. default로 내보낸 모듈 불러오기
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;randomSquare&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./modules/square.js&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 위는 아래 코드를 단축한 형태와 같습니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;randomSquare&lt;/span&gt; } &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./modules/square.js&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 4. as를 사용해 새로운 이름으로 불러오기
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;function1&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;newFunctionName&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;function2&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;anotherNewFunctionName&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./modules/module.js&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 5. 동적으로 모듈 불러오기
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/modules/myModule.js&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;((&lt;span style=&#34;color:#a6e22e&#34;&gt;module&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// Do something with the module.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;장점-2&#34; &gt;장점
&lt;span&gt;
    &lt;a href=&#34;#%ec%9e%a5%ec%a0%90-2&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;h5 id=&#34;자바스크립트-언어에-내장된-표준화된-모듈-시스템임&#34; &gt;자바스크립트 언어에 내장된 표준화된 모듈 시스템임
&lt;span&gt;
    &lt;a href=&#34;#%ec%9e%90%eb%b0%94%ec%8a%a4%ed%81%ac%eb%a6%bd%ed%8a%b8-%ec%96%b8%ec%96%b4%ec%97%90-%eb%82%b4%ec%9e%a5%eb%90%9c-%ed%91%9c%ec%a4%80%ed%99%94%eb%90%9c-%eb%aa%a8%eb%93%88-%ec%8b%9c%ec%8a%a4%ed%85%9c%ec%9e%84&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;h5 id=&#34;비동기-방식으로-모듈을-로딩해-성능-향상&#34; &gt;비동기 방식으로 모듈을 로딩해 성능 향상
&lt;span&gt;
    &lt;a href=&#34;#%eb%b9%84%eb%8f%99%ea%b8%b0-%eb%b0%a9%ec%8b%9d%ec%9c%bc%eb%a1%9c-%eb%aa%a8%eb%93%88%ec%9d%84-%eb%a1%9c%eb%94%a9%ed%95%b4-%ec%84%b1%eb%8a%a5-%ed%96%a5%ec%83%81&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;h5 id=&#34;tree-shaking을-통해-번들-크기-줄일-수-있음&#34; &gt;Tree-shaking을 통해 번들 크기 줄일 수 있음
&lt;span&gt;
    &lt;a href=&#34;#tree-shaking%ec%9d%84-%ed%86%b5%ed%95%b4-%eb%b2%88%eb%93%a4-%ed%81%ac%ea%b8%b0-%ec%a4%84%ec%9d%bc-%ec%88%98-%ec%9e%88%ec%9d%8c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;h4 id=&#34;단점-1&#34; &gt;단점
&lt;span&gt;
    &lt;a href=&#34;#%eb%8b%a8%ec%a0%90-1&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;h5 id=&#34;비교적-최근에-등장했기-때문에-구형-브라우저에서는-완전히-지원되지-않음&#34; &gt;비교적 최근에 등장했기 때문에, 구형 브라우저에서는 완전히 지원되지 않음
&lt;span&gt;
    &lt;a href=&#34;#%eb%b9%84%ea%b5%90%ec%a0%81-%ec%b5%9c%ea%b7%bc%ec%97%90-%eb%93%b1%ec%9e%a5%ed%96%88%ea%b8%b0-%eb%95%8c%eb%ac%b8%ec%97%90-%ea%b5%ac%ed%98%95-%eb%b8%8c%eb%9d%bc%ec%9a%b0%ec%a0%80%ec%97%90%ec%84%9c%eb%8a%94-%ec%99%84%ec%a0%84%ed%9e%88-%ec%a7%80%ec%9b%90%eb%90%98%ec%a7%80-%ec%95%8a%ec%9d%8c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;h5 id=&#34;모듈을-import-하고-export-하는-구문이-복잡할-수-있음&#34; &gt;모듈을 import 하고 export 하는 구문이 복잡할 수 있음
&lt;span&gt;
    &lt;a href=&#34;#%eb%aa%a8%eb%93%88%ec%9d%84-import-%ed%95%98%ea%b3%a0-export-%ed%95%98%eb%8a%94-%ea%b5%ac%eb%ac%b8%ec%9d%b4-%eb%b3%b5%ec%9e%a1%ed%95%a0-%ec%88%98-%ec%9e%88%ec%9d%8c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;h5 id=&#34;모듈을-캐시하지-않아-추가적인-네트워크-요청-발생-가능&#34; &gt;모듈을 캐시하지 않아 추가적인 네트워크 요청 발생 가능
&lt;span&gt;
    &lt;a href=&#34;#%eb%aa%a8%eb%93%88%ec%9d%84-%ec%ba%90%ec%8b%9c%ed%95%98%ec%a7%80-%ec%95%8a%ec%95%84-%ec%b6%94%ea%b0%80%ec%a0%81%ec%9d%b8-%eb%84%a4%ed%8a%b8%ec%9b%8c%ed%81%ac-%ec%9a%94%ec%b2%ad-%eb%b0%9c%ec%83%9d-%ea%b0%80%eb%8a%a5&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;p&gt;모듈이 로드되면 메모리에 캐시하는 &lt;code&gt;CommonJS&lt;/code&gt;와 달리, 기본적으로 모듈을 캐시하지 않습니다.&lt;/p&gt;
&lt;h1 id=&#34;참고&#34; &gt;참고
&lt;span&gt;
    &lt;a href=&#34;#%ec%b0%b8%ea%b3%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/amdjs/amdjs-api/wiki/AMD&#34;&gt;AMD · amdjs/amdjs-api Wiki (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Asynchronous_module_definition&#34;&gt;Asynchronous module definition - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://requirejs.org/docs/whyamd.html&#34;&gt;Why AMD? (requirejs.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://d2.naver.com/helloworld/12864&#34;&gt;JavaScript 표준을 위한 움직임: CommonJS와 AMD (naver.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.commonjs.org/wiki/Modules/1.1.1&#34;&gt;Modules/1.1.1 - CommonJS Spec Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/umdjs/umd?tab=readme-ov-file&#34;&gt;umdjs/umd: UMD (Universal Module Definition) patterns for JavaScript modules that work everywhere. (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/@lisa.berteau.smith/commonjs-and-the-history-of-javascript-modularity-63d8518f103e&#34;&gt;CommonJS and the History of Javascript Modularity | by Lisa Berteau Smith | Medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.syncfusion.com/blogs/post/js-commonjs-vs-es-modules&#34;&gt;Understanding CommonJS vs. ES Modules in JavaScript (syncfusion.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://hacks.mozilla.org/2018/03/es-modules-a-cartoon-deep-dive/&#34;&gt;ES modules: A cartoon deep-dive - Mozilla Hacks - the Web developer blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tc39.es/ecma262/#table-abstract-methods-of-module-records&#34;&gt;ECMAScript® 2025 Language Specification (tc39.es)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.freecodecamp.org/news/modules-in-javascript/#commonjsmodules&#34;&gt;Modules in JavaScript – CommonJS and ESmodules Explained (freecodecamp.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.freecodecamp.org/news/javascript-modules-beginners-guide/&#34;&gt;JavaScript Modules – A Beginner&amp;rsquo;s Guide (freecodecamp.org)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>[Javascript] 이벤트 전파 단계(버블링과 캡처링) 알아보기</title>
      <link>https://cloudsoswift.github.io/post/develop/javascript/event-bubbling-capturing/</link>
      <pubDate>Wed, 26 Jun 2024 17:00:00 +0900</pubDate>
      
      <guid>https://cloudsoswift.github.io/post/develop/javascript/event-bubbling-capturing/</guid>
      <description>&lt;h1 id=&#34;서론&#34; &gt;서론
&lt;span&gt;
    &lt;a href=&#34;#%ec%84%9c%eb%a1%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/orm712/CS-712&#34;&gt;CS 스터디&lt;/a&gt;에서 6월 25일 발표한 &lt;a href=&#34;https://github.com/orm712/CS-712/blob/main/08-JAVASCRIPT/3_Event-Bubbling-Capturing/Readme.md&#34;&gt;&lt;strong&gt;이벤트 캡처링과 버블링&lt;/strong&gt;&lt;/a&gt;에 대해 정리한 문서를 블로그에 공유하고자 한다.&lt;/p&gt;
&lt;h2 id=&#34;이벤트-버블링과-캡처링&#34; &gt;이벤트 버블링과 캡처링
&lt;span&gt;
    &lt;a href=&#34;#%ec%9d%b4%eb%b2%a4%ed%8a%b8-%eb%b2%84%eb%b8%94%eb%a7%81%ea%b3%bc-%ec%ba%a1%ec%b2%98%eb%a7%81&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;HTML 태그에서 발생할 수 있는 이벤트는 &lt;a href=&#34;https://www.w3.org/TR/uievents/&#34;&gt;표준&lt;/a&gt;에 따르면 다음과 같은 순서로 전파됩니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;캡처링 단계(&lt;a href=&#34;https://dom.spec.whatwg.org/#dom-event-capturing_phase&#34;&gt;&lt;code&gt;CAPTURING_PHASE&lt;/code&gt;&lt;/a&gt;) : 이벤트가 DOM 트리 상의 하위 요소로 전파되는 단계&lt;/li&gt;
&lt;li&gt;타깃 단계(&lt;a href=&#34;https://dom.spec.whatwg.org/#dom-event-at_target&#34;&gt;&lt;code&gt;AT_TARGET&lt;/code&gt;&lt;/a&gt;) : 이벤트가 실제 대상 요소에 전달되는 단계&lt;/li&gt;
&lt;li&gt;버블링 단계(&lt;a href=&#34;https://dom.spec.whatwg.org/#dom-event-bubbling_phase&#34;&gt;&lt;code&gt;BUBBLING_PHASE&lt;/code&gt;&lt;/a&gt;) : 이벤트가 DOM 트리 상의 상위 요소로 전파되는 단계&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;event-flow-dom-tree.png&#34; alt=&#34;event-flow-dom-tree.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;즉, 위와 같은 형태로 DOM 트리가 구성되어 있다면, &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;을 클릭하면 이벤트가 최상위 조상부터 시작해 아래로 전파되고, 타겟 요소에 도착해 이벤트가 실행된 후, 다시 위로 전파됩니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;참고로 이벤트 흐름 순서는 &lt;a href=&#34;https://developer.mozilla.org/ko/docs/Web/API/Event/eventPhase&#34;&gt;&lt;code&gt;Event.eventPhase&lt;/code&gt;&lt;/a&gt; 프로퍼티를 통해 알 수 있습니다.
&lt;ul&gt;
&lt;li&gt;이 값이 &lt;code&gt;1&lt;/code&gt;일 경우 &lt;code&gt;캡처링 단계&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;일 경우 &lt;code&gt;타깃 단계&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt;일 경우 &lt;code&gt;버블링 단계&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt;일 경우 현재 이 이벤트가 처리중이지 않음을 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;또한, 이벤트 캡처링 방식과 버블링 방식 모두 존재하는 이유는, 기존에 분리되어 있던 이벤트 전파 방식들을 W3C에서 표준화 하며 둘을 모두 포함하는 시스템을 만들었기 때문입니다.
&lt;ul&gt;
&lt;li&gt;정확히는 &lt;code&gt;Netscape&lt;/code&gt;에서는 이벤트 캡처링만, &lt;code&gt;IE&lt;/code&gt;에서는 이벤트 버블링만 사용했기 때문에 상호 호환성을 위해 이들을 모두 포함하는 시스템이 표준으로 자리잡게 된 것입니다.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.quirksmode.org/js/events_order.html&#34;&gt;Javascript - Event order (quirksmode.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.quirksmode.org/js/events_access.html&#34;&gt;Javascript - Event accessing (quirksmode.org)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;이벤트&#34; &gt;이벤트?
&lt;span&gt;
    &lt;a href=&#34;#%ec%9d%b4%eb%b2%a4%ed%8a%b8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;Web API에서의 &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/Events&#34;&gt;&lt;code&gt;이벤트&lt;/code&gt;&lt;/a&gt;란, 마우스 클릭, 키보드 입력 등 DOM 상의 요소에서 발생할 수 있는 이벤트를 말합니다.&lt;br&gt;
&lt;code&gt;이벤트&lt;/code&gt;는 &lt;em&gt;사용자의 행동 뿐만 아니라&lt;/em&gt;, &lt;code&gt;HTMLElement.click()&lt;/code&gt;과 같은 메서드를 직접 호출하거나, &lt;code&gt;EventTarget.dispatchEvent()&lt;/code&gt;와 같은 메서드를 통해 타겟 객체로 이벤트를 보내는 등 프로그래밍적으로도 발생시킬 수 있습니다.&lt;br&gt;
이렇게 발생한 이벤트에 대응하고 싶다면, &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;와 같은 DOM 요소에 &lt;a href=&#34;https://developer.mozilla.org/ko/docs/Web/API/EventTarget/addEventListener&#34;&gt;&lt;code&gt;EventTarget.addEventListener()&lt;/code&gt;&lt;/a&gt;를 통해 이벤트 처리기를 연결할 수 있습니다.&lt;br&gt;
하나의 &lt;code&gt;요소(Element)&lt;/code&gt;는 하나 이상의 이벤트 처리기를 가질 수 있으며, 동일한 이벤트에 대해 여러 이벤트 처리기를 연결할 수도 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;같은 요소 / 같은 이벤트 / 같은 단계로 설정한 이벤트 처리기들은 설정한 순서대로 동작합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;element&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;addEventListener&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;click&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;alert&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)); &lt;span style=&#34;color:#75715e&#34;&gt;// 먼저 트리거
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;element&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;addEventListener&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;click&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;alert&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;발생한 이벤트는 상기한대로 캡처링 -&amp;gt; 타깃 -&amp;gt; 버블링의 흐름을 순서대로 거치게 됩니다.&lt;/p&gt;
&lt;h3 id=&#34;캡처링-단계&#34; &gt;캡처링 단계
&lt;span&gt;
    &lt;a href=&#34;#%ec%ba%a1%ec%b2%98%eb%a7%81-%eb%8b%a8%ea%b3%84&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;캡처링 단계&lt;/code&gt;란, 이벤트가 하위 요소로 전파되는 이벤트 전파 단계를 말합니다.&lt;br&gt;
&lt;code&gt;on&amp;lt;event&amp;gt;&lt;/code&gt; 프로퍼티, HTML 속성, &lt;code&gt;addEventListener(event, handler)&lt;/code&gt;를 이용해 이벤트 처리기를 연결한 경우, 이들은 캡처링에 대해 알 수 없습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;즉, &lt;code&gt;타깃&lt;/code&gt;, &lt;code&gt;버블링&lt;/code&gt; 단계에서만 동작합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;따라서 이들을 &lt;code&gt;캡처링 단계&lt;/code&gt;에서 &lt;strong&gt;이벤트를 인식&lt;/strong&gt;하게 하려면, &lt;code&gt;addEventListener()&lt;/code&gt;의 &lt;code&gt;capture&lt;/code&gt; 옵션을 &lt;code&gt;true&lt;/code&gt;로 설정해주어야 합니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;element&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;addEventListener&lt;/span&gt;(..., { &lt;span style=&#34;color:#a6e22e&#34;&gt;capture&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 또는
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;element&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;addEventListener&lt;/span&gt;(..., &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;이렇게 &lt;code&gt;capture&lt;/code&gt; 옵션을 &lt;code&gt;true&lt;/code&gt;로 할당해주면 특정 요소에서 이벤트가 발생했을 때, 최상위 조상부터 차례대로 이벤트가 전파될 것입니다.&lt;br&gt;
&lt;code&gt;이벤트&lt;/code&gt;는 &lt;code&gt;document&lt;/code&gt;부터 DOM 트리를 따라 타깃(&lt;code&gt;event.target&lt;/code&gt;)까지 전파되며, &lt;em&gt;해당 이벤트 유형을 처리하는&lt;/em&gt; &lt;code&gt;addEventListener(... , { capture: true })&lt;/code&gt;로 할당된 핸들러들을 동작시킵니다.&lt;/p&gt;
&lt;p&gt;이어서 나올 버블링과 달리 캡처링은 실제 코드에서 사용될 일이 흔치 않습니다.&lt;br&gt;
논리적으로 생각해보면, &lt;em&gt;더 세부적이고 특정적인 요소에 핸들러가 할당될수록&lt;/em&gt; 그 요소에 대한 &lt;strong&gt;세부 사항과 어떤 동작을 요하는지 더 잘 알 것&lt;/strong&gt;입니다.&lt;br&gt;
따라서 &lt;em&gt;이벤트가 발생한 타깃 위치부터 전파되는&lt;/em&gt; &lt;code&gt;버블링 단계&lt;/code&gt;에서 &lt;strong&gt;이벤트를 처리하는 것이 더 적합&lt;/strong&gt;할 것입니다.&lt;/p&gt;
&lt;h3 id=&#34;타깃-단계&#34; &gt;타깃 단계
&lt;span&gt;
    &lt;a href=&#34;#%ed%83%80%ea%b9%83-%eb%8b%a8%ea%b3%84&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;타깃 단계&lt;/code&gt;란, 이벤트가 실제 타깃 요소에 전달되는 이벤트 전파 단계를 말합니다.&lt;br&gt;
엄밀히 말하면, &lt;em&gt;&lt;strong&gt;타깃 단계는 별도로 처리되지 않으며&lt;/strong&gt;&lt;/em&gt; (즉, 이벤트를 더 전파시키지 않음) 캡처링 및 버블링 단계의 &lt;strong&gt;핸들러&lt;/strong&gt;가 &lt;code&gt;타깃 단계에 트리거&lt;/code&gt; 됩니다.&lt;/p&gt;
&lt;h4 id=&#34;eventtarget&#34; &gt;&lt;code&gt;Event.target&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#eventtarget&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;이벤트가 발생한 요소는 이벤트 핸들러 내부에서 &lt;code&gt;Event.target&lt;/code&gt;을 통해 접근할 수 있습니다.
이와 관련해 주의해야 할 사항으로, &lt;code&gt;Event.target&lt;/code&gt;를 &lt;code&gt;Event.currentTarget&lt;/code&gt;과 헷갈리지 않아야 한다는 것입니다.&lt;br&gt;
&lt;code&gt;Event.target&lt;/code&gt;은 실제로 이벤트가 시작된, 타깃 요소를 의미하며, 이는 이벤트가 버블링되어 전파되어도 변하지 않습니다.&lt;br&gt;
반면, &lt;code&gt;Event.currentTarget&lt;/code&gt;(또는 핸들러 내부에서 호출한 &lt;code&gt;this&lt;/code&gt;)은 현재 실행중인 이벤트 핸들러가 &lt;strong&gt;할당된 요소&lt;/strong&gt;를 의미합니다.&lt;br&gt;
예를 들어, &lt;code&gt;div &amp;gt; p&lt;/code&gt; 형태로 DOM 트리가 구성되었고 &lt;code&gt;p&lt;/code&gt;에서 발생한 이벤트를 &lt;code&gt;div&lt;/code&gt;의 이벤트 핸들러가 처리하는 상황이라 가정합시다.&lt;br&gt;
이때, &lt;code&gt;div&lt;/code&gt;의 이벤트 핸들러에서 &lt;code&gt;event.target&lt;/code&gt;을 호출한다면 이는 &lt;code&gt;p&lt;/code&gt;를 가리키고, &lt;code&gt;event.currentTarget&lt;/code&gt;을 호출한다면 이는 &lt;code&gt;div&lt;/code&gt;를 가리킨다는 것입니다.&lt;/p&gt;
&lt;h3 id=&#34;버블링-단계&#34; &gt;버블링 단계
&lt;span&gt;
    &lt;a href=&#34;#%eb%b2%84%eb%b8%94%eb%a7%81-%eb%8b%a8%ea%b3%84&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;버블링 단계&lt;/code&gt;란, 이벤트가 타깃 요소부터 최상위 요소까지 전파되는 이벤트 전파 단계를 말합니다.&lt;br&gt;
이벤트는 상위 요소로 계속해서 전파되며, 해당 이벤트를 처리하는 핸들러를 동작시킵니다.&lt;br&gt;
다만 &lt;code&gt;focus&lt;/code&gt;, &lt;code&gt;blur&lt;/code&gt;, &lt;code&gt;load&lt;/code&gt;/&lt;code&gt;unload&lt;/code&gt; 등과 같이 버블링되지 않는 몇몇 이벤트들도 존재합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이벤트가 버블링 되는지 여부는 &lt;code&gt;Event&lt;/code&gt;의 &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Event/bubbles&#34;&gt;&lt;code&gt;bubbles&lt;/code&gt;&lt;/a&gt;프로퍼티를 통해 알 수 있습니다. 이 값이 &lt;code&gt;true&lt;/code&gt;라면 해당 이벤트는 버블링되어 위로 전파됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;버블링-중단stoppropagation&#34; &gt;버블링 중단(&lt;code&gt;stopPropagation&lt;/code&gt;)
&lt;span&gt;
    &lt;a href=&#34;#%eb%b2%84%eb%b8%94%eb%a7%81-%ec%a4%91%eb%8b%a8stoppropagation&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;버블링을 통해 이벤트가 전파되는 것이 유용할 수 있지만, 그렇지 않은 경우도 있을 수 있습니다.&lt;br&gt;
예를 들어, 이벤트가 계속 전파되어 원하지 않았던 &lt;strong&gt;상위 요소의 이벤트 핸들러까지 동작&lt;/strong&gt;시켜 오동작을 일으킬 수도 있습니다.&lt;br&gt;
이럴 때, 이벤트 핸들러 내부에서 &lt;strong&gt;&lt;code&gt;Event.stopPropagation()&lt;/code&gt;&lt;/strong&gt; 메서드를 호출해 이벤트가 더 버블링 되는 것을 막을 수 있습니다.&lt;br&gt;
다만, &lt;strong&gt;한 요소&lt;/strong&gt;에 특정 이벤트를 처리하는 &lt;em&gt;&lt;strong&gt;핸들러가 여러 개일 경우&lt;/strong&gt;&lt;/em&gt;, 위로 이벤트가 버블링 되는 것은 막을 수 있지만 &lt;strong&gt;다른 핸들러가 동작 하는 것은 막을 수 없습니다&lt;/strong&gt;.&lt;br&gt;
따라서 &lt;em&gt;버블링을 막고&lt;/em&gt; &lt;strong&gt;다른 핸들러의 동작까지 막으려면&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;Event.stopImmediatePropagation()&lt;/code&gt;&lt;/strong&gt; 을 사용해야 합니다.&lt;br&gt;
이렇게 버블링을 막을 수 있긴 하지만, &lt;strong&gt;대부분의 경우(특히 분석, 로깅등을 수행할 때) 버블링이 유용&lt;/strong&gt;하기 때문에 꼭 멈춰야 하는 상황이 아니라면 &lt;strong&gt;막지 않는 것이 좋습니다&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;이벤트-위임event-delegation&#34; &gt;이벤트 위임(Event Delegation)
&lt;span&gt;
    &lt;a href=&#34;#%ec%9d%b4%eb%b2%a4%ed%8a%b8-%ec%9c%84%ec%9e%84event-delegation&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;버블링을 통해 이벤트가 위로 전파된다는 점을 활용해서, 모든 하위 요소에 이벤트 핸들러를 설정하는 대신 상위 요소에서 하위 요소에서 발생하는 이벤트들을 처리하는 핸들러를 설정하는 형태로 구현할 수도 있습니다.&lt;br&gt;
만약 하위 요소에서 이벤트가 발생할 때 비슷한 또는 똑같은 작업을 수행하는 경우, 번거롭게 이들에 모두 이벤트 핸들러를 설정하는 것 보다 위임하는 형태로 작성하면 &lt;strong&gt;코드가 더욱 간결&lt;/strong&gt;해질 수 있습니다.&lt;/p&gt;
&lt;h4 id=&#34;예시---16개의-타일-색-바꾸기&#34; &gt;예시 - 16개의 타일 색 바꾸기
&lt;span&gt;
    &lt;a href=&#34;#%ec%98%88%ec%8b%9c---16%ea%b0%9c%ec%9d%98-%ed%83%80%ec%9d%bc-%ec%83%89-%eb%b0%94%ea%be%b8%ea%b8%b0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;예시로 16개의 div 타일이 있고, 각 타일을 클릭하면 랜덤으로 타일의 색깔을 바꾼다고 합시다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;만약 전자처럼 모든 하위요소(&lt;code&gt;tile&lt;/code&gt;)에 이벤트 핸들러를 단다면 코드는 다음과 같을 것입니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;randomColor&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`rgb(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;floor&lt;/span&gt;(Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;random&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;floor&lt;/span&gt;(Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;random&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;floor&lt;/span&gt;(Math.&lt;span style=&#34;color:#a6e22e&#34;&gt;random&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)`&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;children&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; document.&lt;span style=&#34;color:#a6e22e&#34;&gt;getElementById&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;container&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;children&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;children&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;addEventListener&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;click&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;backgroundColor&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;randomColor&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;반면, 이벤트를 상위 요소(&lt;code&gt;container&lt;/code&gt;)로 위임하게 된다면 코드를 다음과 같이 바꿀 수 있습니다.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;container&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; document.&lt;span style=&#34;color:#a6e22e&#34;&gt;querySelector&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;#container&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;container&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;addEventListener&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;click&amp;#34;&lt;/span&gt;, (&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;backgroundColor&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;randomColor&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;참고&#34; &gt;참고
&lt;span&gt;
    &lt;a href=&#34;#%ec%b0%b8%ea%b3%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events&#34;&gt;Introduction to events - Learn web development | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/Events&#34;&gt;Event reference | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://dom.spec.whatwg.org/&#34;&gt;DOM Standard (whatwg.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ko.javascript.info/bubbling-and-capturing&#34;&gt;버블링과 캡처링 (javascript.info)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://joshua1988.github.io/web-development/javascript/event-propagation-delegation/&#34;&gt;이벤트 버블링, 이벤트 캡처 그리고 이벤트 위임까지 • 캡틴판교 블로그 (joshua1988.github.io)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.quirksmode.org/js/events_order.html&#34;&gt;Javascript - Event order (quirksmode.org)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>[Javascript] Map과 Object, 뭘 써야 할까?</title>
      <link>https://cloudsoswift.github.io/post/develop/javascript/map-vs-object/</link>
      <pubDate>Sun, 21 Apr 2024 06:13:01 +0900</pubDate>
      
      <guid>https://cloudsoswift.github.io/post/develop/javascript/map-vs-object/</guid>
      <description>&lt;h2 id=&#34;서론&#34; &gt;서론
&lt;span&gt;
    &lt;a href=&#34;#%ec%84%9c%eb%a1%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;최근 한 기업의 코딩 테스트를 푸는데, &lt;strong&gt;&lt;code&gt;중첩된 구조&lt;/code&gt;의 객체&lt;/strong&gt;를 필요로 하는 문제를 맞닥들이게 되었다.&lt;br&gt;
나는 &amp;lsquo;&lt;code&gt;Object&lt;/code&gt;가 &lt;code&gt;Map&lt;/code&gt;보다 있는 기능이 별로 없으니까, 혹시 몰라서 &lt;em&gt;메모리 터질 수 있는&lt;/em&gt; &lt;code&gt;Map&lt;/code&gt; 보단 &lt;code&gt;Object&lt;/code&gt;가 낫지 않을까?&amp;rsquo; 라는 생각으로 &lt;code&gt;Object&lt;/code&gt;를 활용해 해당 문제를 풀었다.&lt;br&gt;
그리고 그 이후 내 생각이 맞을까? 라는 생각을 갖게 되었고 이를 직접 테스트 한 뒤 내용을 정리해보고 싶어졌다.&lt;br&gt;
따라서 여러 글을 찾아 보았고, 직접 문제와 유사한 상황을 가정하고 코드를 작성해 시간과 메모리 사용량을 측정해보았다.&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34; &gt;TL;DR
&lt;span&gt;
    &lt;a href=&#34;#tldr&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Map&lt;/code&gt;은 ES6 명세에 따라 선형시간 이하의 접근 시간을 제공해야 한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;V8&lt;/code&gt;과 같은 대부분의 JS 엔진에서는 &lt;code&gt;HashTable&lt;/code&gt;을 활용해 빠른 삽입/접근 시간을 제공한다.&lt;/li&gt;
&lt;li&gt;테스트 결과, 다른 벤치마크들 처럼 &lt;code&gt;Map&lt;/code&gt;이 &lt;code&gt;Object&lt;/code&gt;보다 30~50% 정도 빠른 속도를 보였다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;map-vs-object&#34; &gt;&lt;code&gt;Map&lt;/code&gt; vs &lt;code&gt;Object&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#map-vs-object&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;자바스크립트에서 Map과 Object 모두 &lt;code&gt;키-값&lt;/code&gt; 쌍으로 데이터를 저장하는 것은 동일하지만, 세부적으로는 다른점들이 존재합니다.&lt;/p&gt;
&lt;h3 id=&#34;map&#34; &gt;&lt;code&gt;Map&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#map&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Javascript 2015(ES6)&lt;/code&gt;에서 처음으로 등장했습니다.&lt;/li&gt;
&lt;li&gt;Map은 &lt;code&gt;원시 타입&lt;/code&gt;, &lt;code&gt;객체&lt;/code&gt;, &lt;code&gt;함수&lt;/code&gt; 등 &lt;strong&gt;어떤 데이터 타입&lt;/strong&gt;이든 &lt;strong&gt;키로 지정&lt;/strong&gt;할 수 있습니다.&lt;/li&gt;
&lt;li&gt;맵의 &lt;code&gt;키&lt;/code&gt;는 &lt;strong&gt;삽입된 순서&lt;/strong&gt;대로 순서를 &lt;strong&gt;유지&lt;/strong&gt;합니다.&lt;/li&gt;
&lt;li&gt;Map은 원소들을 &lt;code&gt;반복(Iteration)&lt;/code&gt;하는데 사용하는 &lt;code&gt;forEach&lt;/code&gt;, &lt;code&gt;keys&lt;/code&gt;, &lt;code&gt;values&lt;/code&gt;, &lt;code&gt;entries&lt;/code&gt;와 같은 &lt;strong&gt;&lt;code&gt;빌트인 메서드&lt;/code&gt;&lt;/strong&gt; 들을 갖고 있습니다.&lt;/li&gt;
&lt;li&gt;원소에 접근하기 위해 &lt;code&gt;set()&lt;/code&gt;, &lt;code&gt;get()&lt;/code&gt;와 같은 &lt;strong&gt;메서드를 사용&lt;/strong&gt;해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;object&#34; &gt;&lt;code&gt;Object&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#object&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Object의 &lt;code&gt;키&lt;/code&gt;는 &lt;code&gt;문자열&lt;/code&gt;이거나 &lt;code&gt;기호&lt;/code&gt;여야 합니다.
&lt;ul&gt;
&lt;li&gt;만약 다른 자료형을 사용할 경우, &lt;strong&gt;&lt;code&gt;자동적으로&lt;/code&gt; 문자열로 변경&lt;/strong&gt;됩니다.
&lt;ul&gt;
&lt;li&gt;즉, &lt;code&gt;키&lt;/code&gt;가 동일한지 검사할 때 &lt;code&gt;느슨한 동등 비교(==)&lt;/code&gt;를 통해 값만 비교합니다.
&lt;ul&gt;
&lt;li&gt;이와 달리 Map은 &lt;code&gt;엄격한 동등 비교(===)&lt;/code&gt;를 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Object의 속성들은 &lt;strong&gt;&lt;code&gt;순서를 보장하지 않습니다.&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;대부분의 JS 엔진들이 삽입된 순서를 유지&lt;/em&gt;하려고 하지만, 이는 엔진에서 처리해주는것이지 언어 자체에서 규정된 사항이 아닙니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Object는 &lt;code&gt;prototype chain&lt;/code&gt;이 있어, &lt;strong&gt;프로토타입 객체들로부터 속성과 메서드를 상속&lt;/strong&gt;받습니다.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;프로토타입 체인(prototype chain)&lt;/code&gt;: 모든 객체에는 &lt;code&gt;프로토타입&lt;/code&gt;이라는 다른 객체에 대한 링크가 존재하며, 해당 프로토타입 또한 자체 프로토타입을 가지는데 이러한 연결이 null을 프로토타입으로 하는 객체를 만날 때 까지 계속되는 형태를 뜻합니다.
&lt;img src=&#34;object-prototype.png&#34; alt=&#34;object-prototype.png&#34;&gt;
&lt;ul&gt;
&lt;li&gt;출처: &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes&#34;&gt;Object prototypes - Learn web development | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Object의 원소를 &lt;code&gt;반복&lt;/code&gt;하려면, &lt;code&gt;Object.keys(obj)&lt;/code&gt; 를 통해 키 배열을 추출하거나, &lt;code&gt;for in&lt;/code&gt;문을 사용해야 합니다.&lt;/li&gt;
&lt;li&gt;Object는 원소에 접근하기 위해 &lt;code&gt;대괄호 표현식&lt;/code&gt; 또는 &lt;code&gt;.&lt;/code&gt;을 사용해 직접 접근합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;성능은-어떨까&#34; &gt;성능은 어떨까?
&lt;span&gt;
    &lt;a href=&#34;#%ec%84%b1%eb%8a%a5%ec%9d%80-%ec%96%b4%eb%96%a8%ea%b9%8c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;온라인에 올라온 대부분의 &lt;code&gt;Map&lt;/code&gt; vs &lt;code&gt;Object&lt;/code&gt; 성능 벤치마크에서는 &lt;code&gt;Map&lt;/code&gt;이 삽입, 삭제, 갱신 등의 작업에서 &lt;strong&gt;성능 우위&lt;/strong&gt;를 보이고 있었습니다.&lt;/p&gt;
&lt;h4 id=&#34;map이-성능우위임을-보여주는-벤치마크&#34; &gt;Map이 성능우위임을 보여주는 벤치마크
&lt;span&gt;
    &lt;a href=&#34;#map%ec%9d%b4-%ec%84%b1%eb%8a%a5%ec%9a%b0%ec%9c%84%ec%9e%84%ec%9d%84-%eb%b3%b4%ec%97%ac%ec%a3%bc%eb%8a%94-%eb%b2%a4%ec%b9%98%eb%a7%88%ed%81%ac&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;zhenghao&lt;/code&gt;라는 유저의 벤치마크(&lt;a href=&#34;https://www.zhenghao.io/posts/object-vs-map&#34;&gt;When You Should Prefer Map Over Object In JavaScript (zhenghao.io)&lt;/a&gt;), MeasureThat의 벤치마크(&lt;a href=&#34;https://www.measurethat.net/Benchmarks/Show/11290/4/map-vs-object-real-world-performance#latest_results_block&#34;&gt;Benchmark: Map vs Object (real-world) Performance - MeasureThat.net&lt;/a&gt;) 등 데이터를 살펴보면 삽입/값 가져오기 연산시 &lt;strong&gt;27~50%&lt;/strong&gt; 가량 &lt;strong&gt;Map이 더 빠르다&lt;/strong&gt;는 결과가 나왔음을 알 수 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이 테스트들은 Map이 중첩되지 않은, &lt;strong&gt;깊이가 1인 평면상&lt;/strong&gt;에서 이뤄진 테스트입니다.&lt;/li&gt;
&lt;li&gt;추가로 &lt;strong&gt;메모리&lt;/strong&gt; 역시 &lt;strong&gt;Map이 더 적게 차지&lt;/strong&gt;한다는 결과가 많았습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;왜&#34; &gt;왜?
&lt;span&gt;
    &lt;a href=&#34;#%ec%99%9c&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://262.ecma-international.org/6.0/#sec-map-objects&#34;&gt;ES6 명세&lt;/a&gt;에 따르면, &lt;code&gt;Map&lt;/code&gt; 객체는 &lt;code&gt;HashTable&lt;/code&gt;, 또는 다른 메커니즘을 활용해 컬렉션 요소 수에 대해 &lt;strong&gt;선형 이하의 접근 시간&lt;/strong&gt;을 제공할 수 있어야 합니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Map object must be implemented using either &lt;strong&gt;hash tables or other mechanisms&lt;/strong&gt; that, on average, &lt;strong&gt;provide access times that are sublinear&lt;/strong&gt; on the number of elements in the collection. The data structures used in this Map objects specification is only intended to describe the required observable semantics of Map objects. It is not intended to be a viable implementation model.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이러한 명세를 지키기 위해, 다양한 JS 엔진에서 HashTable을 활용해 &lt;code&gt;Map&lt;/code&gt; 객체를 구현하고 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;V8(Google) - &lt;a href=&#34;https://github.com/v8/v8/blob/master/src/objects/map.cc#L2042&#34;&gt;v8/src/objects/map.cc at master · v8/v8 (github.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SpiderMonkey(Mozilla) - &lt;a href=&#34;https://searchfox.org/mozilla-central/source/js/src/builtin/MapObject.cpp&#34;&gt;MapObject.cpp - mozsearch (searchfox.org)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;오늘은 세계에서 가장 많이 사용되는 &lt;strong&gt;Chromium 기반의 환경&lt;/strong&gt;을 가정하고 성능을 비교해보기 위해, &lt;strong&gt;V8 엔진&lt;/strong&gt;의 &lt;code&gt;Map&lt;/code&gt;에 대해 알아보겠습니다.&lt;/p&gt;
&lt;h4 id=&#34;map-in-v8-engine&#34; &gt;Map in V8 Engine
&lt;span&gt;
    &lt;a href=&#34;#map-in-v8-engine&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;V8 엔진에서 &lt;code&gt;Map&lt;/code&gt;은 &lt;strong&gt;HashTable&lt;/strong&gt;, 정확히는 &lt;code&gt;OrderedHashTable&lt;/code&gt; 이라는 삽입된 순서를 유지하는 HashTable을 사용합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://codereview.chromium.org/220293002/&#34;&gt;Issue 220293002: OrderedHashTable implementation with Set and Map interfaces - Code Review (chromium.org)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이는 &lt;a href=&#34;https://wiki.mozilla.org/User:Jorend/Deterministic_hash_tables&#34;&gt;&lt;code&gt;Deterministic hash table&lt;/code&gt;&lt;/a&gt;라는 자료구조를 기반으로 합니다.&lt;/p&gt;
&lt;h5 id=&#34;deterministic-hash-table&#34; &gt;&lt;code&gt;Deterministic hash table&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#deterministic-hash-table&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h5&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// pseudocode of Deterministic hash table
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Entry&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Key key;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Value value;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Entry &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;chain;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CloseTable&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Entry&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;[] hashTable;  &lt;span style=&#34;color:#75715e&#34;&gt;// array of pointers into the data table
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    Entry[] dataTable;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;기존의 버킷/체인 해시 테이블&lt;/em&gt;과 &lt;strong&gt;조회/삽입&lt;/strong&gt;은 &lt;strong&gt;비슷&lt;/strong&gt;하게 진행되지만, 각 Entry들이 Heap에 별도로 할당되지 않고 &lt;strong&gt;삽입 순서대로&lt;/strong&gt; &lt;code&gt;dateTable&lt;/code&gt;에 저장되게 됩니다. (&lt;code&gt;hashTable&lt;/code&gt;의 각 요소들은 버킷인 &lt;code&gt;dataTable&lt;/code&gt;을 가리킴)&lt;br&gt;
따라서 &lt;code&gt;hashTable&lt;/code&gt;에서 &lt;strong&gt;삽입된 순서&lt;/strong&gt;를 &lt;strong&gt;유지&lt;/strong&gt;할 수 있습니다.&lt;br&gt;
V8 엔진에서 &lt;code&gt;HashTable&lt;/code&gt;을 사용하므로, &lt;code&gt;set&lt;/code&gt;을 통한 삽입과 &lt;code&gt;get&lt;/code&gt;을 통한 탐색에 $O(1)$ 의 시간이 걸릴것으로 유추할 수 있습니다.&lt;/p&gt;
&lt;h2 id=&#34;직접-확인-해보자&#34; &gt;직접 확인 해보자
&lt;span&gt;
    &lt;a href=&#34;#%ec%a7%81%ec%a0%91-%ed%99%95%ec%9d%b8-%ed%95%b4%eb%b3%b4%ec%9e%90&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;앞서 살펴본 테스트들 결과에 따르면, Map이 시간적으로나 공간적으로나 Object에 우위를 보이고 있음을 알 수 있습니다.&lt;br&gt;
그래도 한 번 제 케이스에 맞게 직접 실험해보고 싶었고, &lt;strong&gt;Nested한 구조에서도 우위일지&lt;/strong&gt; 알아보고 싶어졌습니다.&lt;/p&gt;
&lt;h3 id=&#34;테스트-진행-방식&#34; &gt;테스트 진행 방식
&lt;span&gt;
    &lt;a href=&#34;#%ed%85%8c%ec%8a%a4%ed%8a%b8-%ec%a7%84%ed%96%89-%eb%b0%a9%ec%8b%9d&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;테스트에 사용할 명령어 set을 먼저 만듭니다.
&lt;ul&gt;
&lt;li&gt;1,000,000개의 명령어 배열을 만들고, 500,000개의 삽입 명령과 500,000개의 삭제 명령을 만들어 채웁니다. 각 명령은 다음과 같은 형태를 가집니다.
&lt;ul&gt;
&lt;li&gt;주어지는 경로는 &lt;code&gt;.&lt;/code&gt;으로 구분되며, 경로를 이루는 문자열들은 key 또는 property의 이름에 해당합니다.
&lt;ul&gt;
&lt;li&gt;ex) &lt;code&gt;abc.def.fgi&lt;/code&gt;라면, &lt;code&gt;root.get(&#39;abc&#39;).get(&#39;def&#39;).get(&#39;fgi&#39;)&lt;/code&gt;를 통해 접근할 수 있습니다.&lt;/li&gt;
&lt;li&gt;편의상 주어지는 경로는 모두 절대경로입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;[삽입, &amp;quot;경로&amp;quot;]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;경로의 마지막 문자열을 제외한 위치까지 이동한 후, 마지막 문자열의 이름으로 새 Map(또는 Object)을 생성합니다.
&lt;ul&gt;
&lt;li&gt;올바르지 않은 경로인 경우 생성하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[삭제, &amp;quot;경로&amp;quot;]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;경로의 마지막 문자열을 제외한 위치까지 이동한 후, 마지막 문자열의 이름에 해당하는 Map(또는 Object)을 삭제합니다.
&lt;ul&gt;
&lt;li&gt;올바르지 않은 경로인 경우 삭제하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Map으로 먼저 해당 명령들을 수행하고, 시간을 기록합니다.&lt;/li&gt;
&lt;li&gt;Object로 해당 명령들을 동일하게 수행하고, 시간을 기록합니다.
테스트에 사용된 코드는 아래와 같습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;script src=&#34;https://gist.github.com/cloudsoswift/c27280e2909126ffa7aa903573b95f98.js&#34;&gt;&lt;/script&gt;
&lt;h3 id=&#34;테스트-결과&#34; &gt;테스트 결과
&lt;span&gt;
    &lt;a href=&#34;#%ed%85%8c%ec%8a%a4%ed%8a%b8-%ea%b2%b0%ea%b3%bc&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;테스트는 Node.js를 통해 2 * 10회,  MS Edge의 DevTools에 있는 Console에서 1 * 10회 진행되었습니다.&lt;/p&gt;
&lt;h4 id=&#34;time-spent-in-nodejs&#34; &gt;Time Spent in &lt;code&gt;Node.js&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#time-spent-in-nodejs&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&#34;test-nodejs-1.png&#34; alt=&#34;&#34;&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&#34;test-nodejs-2.png&#34; alt=&#34;&#34;&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&#34;time-nodejs.png&#34; alt=&#34;time-nodejs.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;앞서 찾아보았던 벤치마크들의 데이터&lt;/em&gt;처럼 &lt;strong&gt;3~50% 정도&lt;/strong&gt;의 &lt;strong&gt;시간 차이&lt;/strong&gt;가 발생한 것을 알 수 있었습니다.&lt;/p&gt;
&lt;h4 id=&#34;time-spent-in-ms-edge-devtools&#34; &gt;Time Spent in &lt;code&gt;MS Edge Devtools&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#time-spent-in-ms-edge-devtools&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;&lt;img src=&#34;test-msedge.png&#34; alt=&#34;test-msedge.png&#34;&gt;
&lt;img src=&#34;time-msedge.png&#34; alt=&#34;time-msedge.png&#34;&gt;
MS Edge의 Devtools의 Console에서 진행한 테스트 역시 &lt;strong&gt;50%가량의 차이&lt;/strong&gt;를 보이고 있음을 알 수 있었습니다.&lt;/p&gt;
&lt;h4 id=&#34;추가-memory-usage-in-nodejs&#34; &gt;추가) Memory Usage in &lt;code&gt;Node.js&lt;/code&gt;
&lt;span&gt;
    &lt;a href=&#34;#%ec%b6%94%ea%b0%80-memory-usage-in-nodejs&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;&lt;img src=&#34;memory-nodejs.png&#34; alt=&#34;memory-nodejs.png&#34;&gt;
아무래도 제가 Object를 선택했었던 이유가 &lt;strong&gt;&lt;code&gt;메모리 사용량&lt;/code&gt;에 대한 우려&lt;/strong&gt;였기 때문에, 실제로 둘 간의 메모리 사용량 차이가 어느정도 나는지도 파악하고자 했습니다.&lt;br&gt;
하지만, &lt;code&gt;performance&lt;/code&gt;를 통해 &lt;strong&gt;브라우저에서 측정&lt;/strong&gt;하는 것은 &lt;strong&gt;정확한 데이터가 나오지 않았습니다&lt;/strong&gt;.&lt;br&gt;
(&lt;code&gt;--enable-precise-memory-info&lt;/code&gt; 플래그를 켜고 실행하라는 &lt;a href=&#34;https://trackjs.com/blog/monitoring-javascript-memory/&#34;&gt;조언&lt;/a&gt;대로 했는데도 불구하고 말이죠)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;performance.memory&lt;/code&gt;의 &lt;code&gt;usedJSHeapSize&lt;/code&gt; 변화량을 추적하고자 했으나, 보안상 이슈?로 정확한 값을 브라우저에서 제공하지 않았습니다. (추가로, &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Performance/memory&#34;&gt;MDN의 API 문서&lt;/a&gt;에 따르면 &lt;code&gt;Deprecated&lt;/code&gt;된 기능이라고 합니다.)&lt;/li&gt;
&lt;li&gt;따라서 &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Performance/measureUserAgentSpecificMemory&#34;&gt;&lt;code&gt;performance.measureUserAgentSpecificMemory()&lt;/code&gt;&lt;/a&gt; 나, &lt;a href=&#34;https://ui.toast.com/weekly-pick/ko_20200423&#34;&gt;Toast UI 팀 블로그의 글&lt;/a&gt;을 읽고 &lt;code&gt;performance.measureMemory()&lt;/code&gt; 같은 다른 API를 사용하고자 했으나, &lt;code&gt;Experimental&lt;/code&gt; 기능이기 때문인지 사용할 수가 없었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그래서 &lt;code&gt;Node.js&lt;/code&gt;에서라도 메모리 사용량을 측정해보고자 했습니다.&lt;br&gt;
찾아보니, &lt;code&gt;Node.js&lt;/code&gt;에서는 &lt;code&gt;--expose-gc&lt;/code&gt; 플래그를 이용해 사용자가 명시적으로 &lt;code&gt;gc&lt;/code&gt;를 호출하므로써 자동으로 &lt;code&gt;gc&lt;/code&gt;가 발생하는 &lt;strong&gt;텀을 늘려&lt;/strong&gt;, 잦은 gc 발생 없이 &lt;strong&gt;테스트하는 시간동안의 메모리 변동을 측정&lt;/strong&gt;할 수 있다고 하여 해당 방법을 사용했습니다.&lt;br&gt;
그러나 &lt;code&gt;Map&lt;/code&gt;을 테스트할 때 &lt;strong&gt;메모리 사용량 값이 튀는 경우&lt;/strong&gt;가 발생해, 측정한 데이터도 그냥 &amp;lsquo;아 메모리 사용량도 &lt;code&gt;Map&lt;/code&gt;이 &lt;strong&gt;훨씬 적구나&lt;/strong&gt;&amp;rsquo; 정도를 &lt;strong&gt;&lt;code&gt;짐작&lt;/code&gt;&lt;/strong&gt; 하는 용도로만 사용할 수 있을것 같습니다.&lt;/p&gt;
&lt;h2 id=&#34;결론&#34; &gt;결론
&lt;span&gt;
    &lt;a href=&#34;#%ea%b2%b0%eb%a1%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;Javascript에서 key를 통해 탐색해야하는 Dictionary 형태의 구조체(&lt;em&gt;중첩된 형태의 구조더라도&lt;/em&gt;)를 사용해야 한다면, &lt;strong&gt;웬만하면 &lt;code&gt;Map&lt;/code&gt;을 쓰는 것이 좋다!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;추가로, V8 엔진에서 사용하는 &lt;code&gt;hashTable&lt;/code&gt;의 구조라던지, V8 소스 코드를 찾아보는 등의 경험을 할 수 있어서 새로웠다!&lt;/li&gt;
&lt;li&gt;나중엔 이런 소스 코드들을 전부 이해하고 나아가 Contribute 할 수 있는 개발자가 될 수 있도록 노력해야겠다!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;참고&#34; &gt;참고
&lt;span&gt;
    &lt;a href=&#34;#%ec%b0%b8%ea%b3%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://262.ecma-international.org/6.0/#sec-map-objects&#34;&gt;ECMAScript 2015 Language Specification – ECMA-262 6th Edition (ecma-international.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://itnext.io/v8-deep-dives-understanding-map-internals-45eb94a183df&#34;&gt;[V8 Deep Dives] Understanding Map Internals | by Andrey Pechkurov | ITNEXT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://codereview.chromium.org/220293002/&#34;&gt;Issue 220293002: OrderedHashTable implementation with Set and Map interfaces - Code Review (chromium.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://codereview.chromium.org/947683002/#ps200001&#34;&gt;Issue 947683002: Reimplement Maps and Sets in JS - Code Review (chromium.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.geeksforgeeks.org/map-vs-object-in-javascript/&#34;&gt;Map vs Object in JavaScript - GeeksforGeeks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Keyed_collections&#34;&gt;키 기반 컬렉션 - JavaScript | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://stackoverflow.com/questions/32886522/javascript-objects-vs-map-performance-chrome-v8-node-js&#34;&gt;Javascript Objects vs Map performance (Chrome, V8, Node JS) - Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://trackjs.com/blog/monitoring-javascript-memory/&#34;&gt;Monitoring JavaScript Memory - TrackJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Performance/measureUserAgentSpecificMemory&#34;&gt;Performance: measureUserAgentSpecificMemory() method - Web APIs | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Performance/memory&#34;&gt;Performance: memory property - Web APIs | MDN (mozilla.org)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ui.toast.com/weekly-pick/ko_20200423/&#34;&gt;performance.measureMemory()로 웹 페이지 전체 메모리 사용량 모니터링하기 | TOAST UI :: Make Your Web Delicious!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>[Javascript] 순환 참조 (Circular Import)</title>
      <link>https://cloudsoswift.github.io/post/develop/javascript/circular-import/circular_import/</link>
      <pubDate>Sun, 19 Feb 2023 11:22:33 +0900</pubDate>
      
      <guid>https://cloudsoswift.github.io/post/develop/javascript/circular-import/circular_import/</guid>
      <description>&lt;p&gt;오늘은 Javascript, Python같은 언어에서 import시 발생할 수 있는 순환 참조 에러에 대한 포스트를 작성하고자 한다.&lt;/p&gt;
&lt;h1 id=&#34;순환-참조&#34; &gt;순환 참조
&lt;span&gt;
    &lt;a href=&#34;#%ec%88%9c%ed%99%98-%ec%b0%b8%ec%a1%b0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h1&gt;&lt;h2 id=&#34;메모리-관점에서의-순환-참조--in-javascript-&#34; &gt;메모리 관점에서의 순환 참조 ( In Javascript )
&lt;span&gt;
    &lt;a href=&#34;#%eb%a9%94%eb%aa%a8%eb%a6%ac-%ea%b4%80%ec%a0%90%ec%97%90%ec%84%9c%ec%9d%98-%ec%88%9c%ed%99%98-%ec%b0%b8%ec%a1%b0--in-javascript-&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;간단히 요약하자면, 서로 다른 두 객체가 서로를 참조하여, 가비지 컬렉션 알고리즘의 대상에 포함되지 않아 해당 객체들이 불필요해져도 메모리 회수되지 않고 존속하게되는 문제이다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management&#34;&gt;Mozilla Developer Network의 문서&lt;/a&gt;의 예시를 드는게 이해하기 쉽다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt;;         &lt;span style=&#34;color:#75715e&#34;&gt;// x는 y를 참조합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;y&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;x&lt;/span&gt;;         &lt;span style=&#34;color:#75715e&#34;&gt;// y는 x를 참조합니다.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;azerty&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;다음 예제에서는 두 객체가 서로 참조하는 속성으로 생성되어 순환 구조를 생성합니다.&lt;br&gt;
함수 호출이 완료되면 이 두 객체는 스코프를 벗어나게 될 것이며, 그 시점에서 두 객체는 불필요해지므로 할당된 메모리는 회수되어야 합니다.&lt;br&gt;
그러나 두 객체가 서로를 참조하고 있으므로, &lt;strong&gt;참조-세기 알고리즘&lt;/strong&gt;은 둘 다 가비지 컬렉션의 대상으로 표시하지 않습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;참조-세기(Reference-counting) 알고리즘&lt;/strong&gt; : 가비지 컬렉션시 사용하는 알고리즘으로, &amp;ldquo;어떤 다른 객체도 참조하지 않는 객체&amp;quot;를 더 이상 필요없는 객체로 인식하고 가비지 컬렉션을 수행.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;import에서의-순환-참조circular-dependencies-in-javascript&#34; &gt;import에서의 순환 참조(Circular Dependencies) (In Javascript)
&lt;span&gt;
    &lt;a href=&#34;#import%ec%97%90%ec%84%9c%ec%9d%98-%ec%88%9c%ed%99%98-%ec%b0%b8%ec%a1%b0circular-dependencies-in-javascript&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;2가지 이상의 모듈에서 import가 꼬리의 꼬리를 물어 순환 구조를 이루어 에러가 발생하는 경우.&lt;/li&gt;
&lt;li&gt;예시
&lt;img src=&#34;circular.png&#34; alt=&#34;circular import&#34;&gt;&lt;/li&gt;
&lt;li&gt;위와 같이 참조의 순환 고리가 발생하게 될 경우, 그 고리의 어느 한 모듈(&lt;em&gt;순환 고리안의 다른 모듈을 참조하는&lt;/em&gt;)을 이용하려 하면&lt;br&gt;
&lt;code&gt;ReferenceError: Cannot access &#39;모듈 이름&#39; before initialization&lt;/code&gt;&lt;br&gt;
라며 에러가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;나의-사례&#34; &gt;나의 사례
&lt;span&gt;
    &lt;a href=&#34;#%eb%82%98%ec%9d%98-%ec%82%ac%eb%a1%80&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;본인은 &lt;em&gt;Axios 모듈&lt;/em&gt;, &lt;em&gt;Redux 객체(store)를 export 하는 모듈&lt;/em&gt;, &lt;em&gt;Redux Toolkit의 slice 객체를 export하는 모듈&lt;/em&gt;를 사용하며 React 프로젝트를 개발하고 있었다.&lt;/li&gt;
&lt;li&gt;개발 초-중반기에만 해도 &lt;em&gt;&lt;strong&gt;&amp;lsquo;Redux 객체 -&amp;gt; Redux Toolkit의 Slice 객체&amp;rsquo;&lt;/strong&gt;&lt;/em&gt;, &lt;em&gt;&lt;strong&gt;&amp;lsquo;Slice 객체 -&amp;gt; Axios 모듈&amp;rsquo;&lt;/strong&gt;&lt;/em&gt; 로의 참조 외에는 모듈간의 연관관계가 존재하지 않아 순환 참조가 발생하지 않아 에러가 발생하지 않았다.
&lt;img src=&#34;before_circular_import.png&#34; alt=&#34;before_circular_import&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;&amp;lsquo;Redux 객체 -&amp;gt; Redux Toolkit의 Slice 객체&amp;rsquo;&lt;/strong&gt;&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;Redux Toolkit Slice들의 Reducer를 모은 rootReducer를 메인 Redux객체(store)에 할당하기 위해 Slice 객체를 참조.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;&amp;lsquo;Slice 객체 -&amp;gt; Axios 모듈&amp;rsquo;&lt;/strong&gt;&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;비동기 작업 후 state를 update하는 로직을 위해, Redux 액션 생성함수(Action Creator)를 만들어서 사용하였다.&lt;/li&gt;
&lt;li&gt;이 때, 비동기 작업을 위해 Axios 모듈을 사용했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;사건의-발단&#34; &gt;사건의 발단
&lt;span&gt;
    &lt;a href=&#34;#%ec%82%ac%ea%b1%b4%ec%9d%98-%eb%b0%9c%eb%8b%a8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;그러다 Axios 모듈에 interceptor를 설정해, request를 보내기 전 &amp;lsquo;유저 Slice&amp;rsquo;에 저장된 AccessToken을 불러와 Header에 첨부해주려 했는데 순환 참조 에러가 발생했다.&lt;br&gt;
&lt;code&gt;Uncaught ReferenceError: Cannot access &#39;__WEBPACK_DEFAULT_EXPORT__&#39; before initialization&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;해당 에러를 맞닥들인 당시, 나는 &amp;lsquo;순환 참조&amp;rsquo;라는 개념도 잘 알지 못했고 이러한 행위가 에러를 발생시킨다는 것 역시 알지 못했다.&lt;/li&gt;
&lt;li&gt;그리고 여러 글들을 찾아 보다가, 관련된 &lt;a href=&#34;https://stackoverflow.com/questions/65038253/uncaught-referenceerror-cannot-access-webpack-default-export-before-initi&#34;&gt;stackoverflow 글&lt;/a&gt;을 보고 어느정도 왜 에러를 발생시키는 행위인지 알 수 있었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;원인&#34; &gt;원인
&lt;span&gt;
    &lt;a href=&#34;#%ec%9b%90%ec%9d%b8&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;request를 보내기 전에 Redux Store를 확인하고 만약 AccessToken이 존재하면 해당 값 가져와서 &lt;em&gt;Header의 Authorization&lt;/em&gt;으로 설정한 뒤 요청을 보내는 로직을 수행하는 interceptor를 Axios 모듈에다 달아주고 싶었다.&lt;/li&gt;
&lt;li&gt;React에서 자주 쓰던것 처럼, &lt;code&gt;useDispatch()&lt;/code&gt;훅을 통해 dispatch 함수를 반환 받아, Action Creator를 통해 만든 Action을 dispatch하는 방식으로 AccessToken을 가져오는 것이 원래 계획이었다.&lt;/li&gt;
&lt;li&gt;그러나 &lt;em&gt;Axios 모듈&lt;/em&gt;은 React Component가 아니기 때문에, React Component 외부에서는 &lt;em&gt;Redux Store 모듈&lt;/em&gt;을 불러와 Store 객체가 갖고있는 dispatch 함수를 호출해야 했다.&lt;/li&gt;
&lt;li&gt;그래서 &lt;em&gt;Redux Store 모듈&lt;/em&gt;을 불러와 dispatch를 함수를 호출하려 했는데, Redux Store를 불러오는 로직을 추가하니 상기한 내용의 에러를 내놓고 있었다.&lt;/li&gt;
&lt;li&gt;즉, &lt;em&gt;Axios 모듈&lt;/em&gt;에서 &lt;em&gt;Redux Store 모듈&lt;/em&gt;을 import함으로써 아래와 같은 구조가 형성되어 버린것이었다.
&lt;img src=&#34;after_circular_import.png&#34; alt=&#34;after_circular_import&#34;&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;store 객체를 생성하려면 &lt;em&gt;user-slice의 reducer가 필요&lt;/em&gt;해 &lt;em&gt;&lt;strong&gt;user-slice.js를 import&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;user-slice.js 내부에 정의된 Action Creator 함수는 비동기 작업을 처리하기 위해 &lt;em&gt;Axios 모듈이 필요&lt;/em&gt;해 &lt;em&gt;&lt;strong&gt;http.js를 import&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Axios 모듈에서는 store 객체 안에 저장된 AccessToken을 가져오기 위해 &lt;em&gt;store 객체가 필요&lt;/em&gt;해 &lt;em&gt;&lt;strong&gt;store.js를 import&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;해결&#34; &gt;해결?
&lt;span&gt;
    &lt;a href=&#34;#%ed%95%b4%ea%b2%b0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Action Creator 함수&lt;/em&gt;, Store에 접근하는 &lt;em&gt;interceptor&lt;/em&gt;, Slice들의 reducer를 combine해 사용하는 &lt;em&gt;store 객체&lt;/em&gt; 모두 놓치고 싶지 않았지만, 에러를 해결해야 해 어쩔 수 없이 &lt;em&gt;&lt;strong&gt;Action Creator 함수&lt;/strong&gt;&lt;/em&gt;를 사용하지 않는 방향으로 코드를 수정했다.
&lt;ul&gt;
&lt;li&gt;Axios 모듈을 사용하는 Action Creator 함수로 로그인, 로그아웃이 있었는데, 해당 작업을 각 기능을 사용하는 component(로그인 - 로그인 페이지, 로그아웃 - 네비게이션 바)에서 정의하도록 하여 순환 관계를 끊었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;결론&#34; &gt;결론?
&lt;span&gt;
    &lt;a href=&#34;#%ea%b2%b0%eb%a1%a0&#34;&gt;
        &lt;svg viewBox=&#34;0 0 28 23&#34; height=&#34;100%&#34; width=&#34;19&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;path d=&#34;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&#34; fill=&#34;none&#34; stroke-linecap=&#34;round&#34; stroke-miterlimit=&#34;10&#34; stroke-width=&#34;2&#34;/&gt;&lt;/svg&gt;
    &lt;/a&gt;
&lt;/span&gt;
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;순환 참조가 발생할 경우, 순환 고리에 포함된 모듈(객체)들은 생성이 안 되어 사용이 불가능하므로 순환 참조가 발생하지 않도록 코드를 짜는것이 중요하다는걸 몇 시간의 실랑이 끝에 알 수 있었다&amp;hellip;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
