<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>달콘박스</title>
    <link>https://dalconbox.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 19 Jun 2026 23:24:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>연권</managingEditor>
    <image>
      <title>달콘박스</title>
      <url>https://tistory1.daumcdn.net/tistory/1887076/attach/abf8a10ce9ff4154bfa2adc7f181c0fe</url>
      <link>https://dalconbox.tistory.com</link>
    </image>
    <item>
      <title>Observer Pattern</title>
      <link>https://dalconbox.tistory.com/326</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.patterns.dev/&quot;&gt;Patterns.dev&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사이트를 참고하여 작성한 시리즈 입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Observer Pattern&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 옵저버블을 사용해 이벤트가 발생할 때 구독자에게 알리기&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵저버 패턴을 사용하면 특정 객체(object)나 옵저버(observer)를 옵저버블(observable)이라 불리는 다른 객체를 구독(subscribe)할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;observable 객체는 일반적으로 3가지 중요한 요소를 포함합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;observers: 특정 이벤트가 발생할 때마다 알림을 받는 observer 배열&lt;/li&gt;
&lt;li&gt;subscribe(): observers에 observer를 추가하는 메소드&lt;/li&gt;
&lt;li&gt;unsubscribe(): observers에서 observer를 삭제하는 메소드&lt;/li&gt;
&lt;li&gt;notify(): 특정 이벤트가 발생할 때마다 모든 observer에게 알리는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Observable 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES6의 class를 사용하면 쉽게 만들 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqTZ5c/btrFpuABKpW/TYPYNZbvFDSRHMcScWnJVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqTZ5c/btrFpuABKpW/TYPYNZbvFDSRHMcScWnJVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqTZ5c/btrFpuABKpW/TYPYNZbvFDSRHMcScWnJVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqTZ5c%2FbtrFpuABKpW%2FTYPYNZbvFDSRHMcScWnJVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;1050&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subscribe 메소드로 observers에 옵저버를 추가하고 unsubscribe 메소드로 옵저버를 제거하며, notify 메소드로 모든 구독자에게 payload를 전달할 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Observable 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵저버블을 사용해 봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드는 Button과 Switch 컴포넌트를 갖고 있는 기본적인 어플리케이션입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csj40k/btrFomXRZzA/FFVFPR5adjzeLazY2PDPT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csj40k/btrFomXRZzA/FFVFPR5adjzeLazY2PDPT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csj40k/btrFomXRZzA/FFVFPR5adjzeLazY2PDPT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcsj40k%2FbtrFomXRZzA%2FFFVFPR5adjzeLazY2PDPT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;640&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 어플리케이션과 사용자의 상호작용을 추적하고 싶습니다. 사용자가 버튼을 클릭하거나(event) 스위치를 전환할 때(event)마다 이 이벤트를 타임스탬프와 함께 기록하고 표시되는 토스트 알림도 만들고 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 만들고자 하는 형태는 다음과 같습니다.&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 handleClick 이나 handleToggle을 호출할 때마다 observer에 있는 notify 메소드를 호출시킵니다. notify 메소드는 모든 subscriber에 의해 handleClick이나 handleToggle에서 전달된 data(payload)를 통지합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 logger와 toadtify 함수를 작성하겠습니다. 이 함수들은 최종적으로 notify 메소드에서 data(payload)를 전달받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DVdJx/btrFpuUVfDk/XqmPyflqPWfnvs8Ngqzln0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DVdJx/btrFpuUVfDk/XqmPyflqPWfnvs8Ngqzln0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DVdJx/btrFpuUVfDk/XqmPyflqPWfnvs8Ngqzln0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDVdJx%2FbtrFpuUVfDk%2FXqmPyflqPWfnvs8Ngqzln0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;1050&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 옵저버블이 logger와 toastify를 인지하지 못합니다. 옵저버가 되도록 하려면 이 함수들을 옵저버블에 subscribe 메소드를 사용하여 등록해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw78rW/btrFnBnp6fi/AleM6li6U7fDes7EWhfIoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw78rW/btrFnBnp6fi/AleM6li6U7fDes7EWhfIoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw78rW/btrFnBnp6fi/AleM6li6U7fDes7EWhfIoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw78rW%2FbtrFnBnp6fi%2FAleM6li6U7fDes7EWhfIoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;1162&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이벤트가 발생할 때마다 logger와 toatify 함수가 실행됩니다. 이제 옵저버블의 notify를 호출할 핸들러 함수만 구현하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 이름은 handleClick, handleToggle로 하겠습니다. 그리고 함수에 옵저버가 수신해야할 데이터를 함께 넘겨줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCQSwh/btrFQXPae47/4Yzji1VY0xUqhLykHUsHFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCQSwh/btrFQXPae47/4Yzji1VY0xUqhLykHUsHFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCQSwh/btrFQXPae47/4Yzji1VY0xUqhLykHUsHFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCQSwh%2FbtrFQXPae47%2F4Yzji1VY0xUqhLykHUsHFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;1490&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 전체 흐름을 완성했습니다. handleClick() 이나 handleToggle()을 호출하면 notify를 통해 logger()와 toastify()를 호출하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵저버 패턴은 여러 가지 방법으로 사용할 수 있지만 비동기 이벤트기반 데이터를 사용할 때 매우 유용합니다. 특정 데이터가 다운로드 완료될 때 또는 사용자가 메세지 보드에 알림을 보내고 다른 사용자들이 알림을 받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사례&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Observable을 사용하는 일반적인 라이브러리는 RxJS입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;ReactiveX는 옵저버 패턴과 이터레이터 패턴을 함수형 프로그래밍과 컬렉션을 결합하여 이벤트 시퀀스를 관리하는 이상적인 방법을 제공합니다.&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RxJS로 옵저버블을 생성하고 일부 이벤트들을 subscribe 해보겠습니다. 다음 예시는 사용자가 화면을 드래그 했는지 여부를 console.log를 통해 표시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2O3AF/btrFLBUbbaT/NRQjwN0DBaKGK5HSWis5h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2O3AF/btrFLBUbbaT/NRQjwN0DBaKGK5HSWis5h1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2O3AF/btrFLBUbbaT/NRQjwN0DBaKGK5HSWis5h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2O3AF%2FbtrFLBUbbaT%2FNRQjwN0DBaKGK5HSWis5h1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;1116&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵저버 패턴은 관심사 분리와 단일 책임 원칙을 강제할 수 있는 좋은 방법입니다. 옵저버는 옵저버블과 긴밀하게 결합되지 않으며 언제든지 합치거나 분리할 수 있습니다. 옵저버블은 이벤트를 모니터링 하는 역할을 하며 옵저버는 수신된 데이터를 처리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵저버가 너무 복잡해지면 모든 구독자에게 통지할 때 퍼포먼스 문제가 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Reference&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.patterns.dev/posts/singleton-pattern/&quot;&gt;https://www.patterns.dev/posts/singleton-pattern/&lt;/a&gt;&lt;/p&gt;</description>
      <category>Web/Patterns</category>
      <category>javascript</category>
      <category>Oberver</category>
      <category>Obserable</category>
      <author>연권</author>
      <guid isPermaLink="true">https://dalconbox.tistory.com/326</guid>
      <comments>https://dalconbox.tistory.com/326#entry326comment</comments>
      <pubDate>Tue, 21 Jun 2022 22:57:17 +0900</pubDate>
    </item>
    <item>
      <title>Proxy Pattern (JavaScript)</title>
      <link>https://dalconbox.tistory.com/325</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.patterns.dev/&quot;&gt;Patterns.dev&lt;/a&gt;를 참고하여 작성한 시리즈 입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Proxy Pattern&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;대상 객체에 대한 상호작용 가로채기 및 제어&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Proxy 객체를 사용하면 특정 객체와 상호작용을 보다 효과적으로 제어할 수 있습니다. 프록시 객체는 값을 얻거나 설정할 때 등 상호작용할 때의 동작을 설정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 프록시는 다른 사람의 대리인을 의미합니다. 상대방과 직접 대화하는 대신, 당신이 대화하려고 했던 사람을 대신할 대리인과 대화합니다. JavaScript에서도 마찬가지 입니다. 원본 객체와 대화하는 대신 Proxy 객체와 대화합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-&amp;gt; 원본 객체를 Immutable하게 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 yeon 객체를 생성합니다. 저를 나타내는 객체입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boIVLC/btrDWl0K6PA/2cJuRxozzIl5MGPQEf3QC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boIVLC/btrDWl0K6PA/2cJuRxozzIl5MGPQEf3QC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boIVLC/btrDWl0K6PA/2cJuRxozzIl5MGPQEf3QC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboIVLC%2FbtrDWl0K6PA%2F2cJuRxozzIl5MGPQEf3QC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;558&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 객체와 직접 상호작용 하는 대신 프록시 객체와 상호작용하는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript에서는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Proxy&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Proxy&lt;/a&gt;를 통해 프록시 객체를 쉽게 생성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/miZvu/btrD8iHFISd/6rxNw7bQ0RRrLOzgRJsM81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/miZvu/btrD8iHFISd/6rxNw7bQ0RRrLOzgRJsM81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/miZvu/btrD8iHFISd/6rxNw7bQ0RRrLOzgRJsM81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmiZvu%2FbtrD8iHFISd%2F6rxNw7bQ0RRrLOzgRJsM81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;634&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Proxy의 두 번째 인자는 핸들러를 나타내는 객체입니다. 핸들러 객체에서 상호작용 유형에 따라 특정 동작을 정의할 수 있습니다. 메서드는 여러 가지가 있지만 가장 일반적인 두 가지 메서드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;get: 속성에 &lt;b&gt;엑세스&lt;/b&gt;하려고 할 때 호출됩니다.&lt;/li&gt;
&lt;li&gt;set: 속성을 &lt;b&gt;수정&lt;/b&gt;하려고 할 때 호출됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Proxy 핸들러 추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yeonProxy에 핸들러를 추가해봅시다. get과 set메서드를 호출할 때 console을 찍을 수 있도록 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pUWRQ/btrEaNHveZK/HAqTgSkFEDdkov0alQPzxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pUWRQ/btrEaNHveZK/HAqTgSkFEDdkov0alQPzxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pUWRQ/btrEaNHveZK/HAqTgSkFEDdkov0alQPzxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpUWRQ%2FbtrEaNHveZK%2FHAqTgSkFEDdkov0alQPzxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;782&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;782&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성을 수정하거나 탐색하려고 하면 어떤 일이 일어나는지 살펴보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;894&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byMjUQ/btrEaOl5gWy/khPrUFMOg8NKnsshvIKyC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byMjUQ/btrEaOl5gWy/khPrUFMOg8NKnsshvIKyC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byMjUQ/btrEaOl5gWy/khPrUFMOg8NKnsshvIKyC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyMjUQ%2FbtrEaOl5gWy%2FkhPrUFMOg8NKnsshvIKyC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;894&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;894&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성을 수정하거나 탐색할 때 console.log가 찍히게 되었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;활용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Proxy는 validation(검증)을 추가할 때 유용합니다. 사용자는 yeon의 age 값을 string 타입으로 변경해선 안됩니다. 또한 존재하지 않는 속성에 엑세스하려고 할 경우 사용자에게 알려야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnuDCv/btrFkZ1elSQ/yQweTxcHbjEzwg9cTHfxYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnuDCv/btrFkZ1elSQ/yQweTxcHbjEzwg9cTHfxYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnuDCv/btrFkZ1elSQ/yQweTxcHbjEzwg9cTHfxYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnuDCv%2FbtrFkZ1elSQ%2FyQweTxcHbjEzwg9cTHfxYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;1050&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if문을 통해 객체가 의도하지 않은 형태의 값을 넣지 못하도록 했습니다. 즉 순수하게 데이터를 유지하는 데 도움이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reflect&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript는 Reflect라고 불리는 내장 객체를 제공합니다. Reflect를 사용하면 proxy를 사용할 때 대상 객체를 쉽게 다룰 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에는 []을 통해서 직접 값을 가져오거나 대상 객체의 속성을 수정하고 엑세스 하려고 했습니다. 그 대신 Proxy의 핸들러를 모두 동일하게 갖고 있는 Reflect를 통해 Reflect.get(), Reflect.set()을 사용하는 것으로 객체의 속성을 엑세스하거나 변경할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpUtTJ/btrFg7NJ4On/kWMKe1SgrJNvrSXv3SAQK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpUtTJ/btrFg7NJ4On/kWMKe1SgrJNvrSXv3SAQK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpUtTJ/btrFg7NJ4On/kWMKe1SgrJNvrSXv3SAQK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpUtTJ%2FbtrFg7NJ4On%2FkWMKe1SgrJNvrSXv3SAQK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;640&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reflect를 사용함으로써 더 깔끔하게 에러핸들링과 값의 반영을 구현할 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Reference&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://ui.toast.com/weekly-pick/ko_20210413&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ui.toast.com/weekly-pick/ko_20210413&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://www.patterns.dev/posts/singleton-pattern/&quot;&gt;https://www.patterns.dev/posts/singleton-pattern/&lt;/a&gt;&lt;/p&gt;</description>
      <category>Web/Patterns</category>
      <category>proxy</category>
      <category>Proxy Pattern</category>
      <category>reflect</category>
      <author>연권</author>
      <guid isPermaLink="true">https://dalconbox.tistory.com/325</guid>
      <comments>https://dalconbox.tistory.com/325#entry325comment</comments>
      <pubDate>Tue, 7 Jun 2022 06:09:15 +0900</pubDate>
    </item>
    <item>
      <title>Singleton Pattern (JavaScript)</title>
      <link>https://dalconbox.tistory.com/323</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.patterns.dev/&quot;&gt;Patterns.dev&lt;/a&gt;를 참고하여 작성한 시리즈 입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Singleton Pattern&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;애플리케이션 전체에서 단일 인스턴스 공유&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글턴 패턴은 한 번의 인스턴스화가 가능한 클래스로 글로벌하게 엑세스할 수 있습니다. 이 단일 클래스는 애플리케이션 전체에 공유할 수 있기 때문에 애플리케이션의 글로벌 상태를 관리하는 데 적합합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Counter 클래스를 작성해보겠습니다. Counter 클래스는 다음과 같은 메소드를 제공합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;getInstance: 인스턴스를 반환합니다.&lt;/li&gt;
&lt;li&gt;getCount: 현재 counter 값을 반환합니다.&lt;/li&gt;
&lt;li&gt;increment: 카운터를 1 증가시킵니다.&lt;/li&gt;
&lt;li&gt;decrement: 카운터를 1 감소시킵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfk6pJ/btrD18Uze2h/RsM3OR7tn5JXhKX4BL7uR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfk6pJ/btrD18Uze2h/RsM3OR7tn5JXhKX4BL7uR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfk6pJ/btrD18Uze2h/RsM3OR7tn5JXhKX4BL7uR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfk6pJ%2FbtrD18Uze2h%2FRsM3OR7tn5JXhKX4BL7uR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;439&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 클래스는 싱글턴의 기준을 충족시키지 못합니다. 싱글턴은 한 번만 인스턴스화 할 수 있습니다. 위 클래스는 복수의 인스턴스를 생성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c24fvk/btrD19FS2Uu/xD2uJdB6z99ifuXdbY86a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c24fvk/btrD19FS2Uu/xD2uJdB6z99ifuXdbY86a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c24fvk/btrD19FS2Uu/xD2uJdB6z99ifuXdbY86a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc24fvk%2FbtrD19FS2Uu%2FxD2uJdB6z99ifuXdbY86a1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;492&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스를 한 개만 생성할 수 있는 한 가지 방법은 instance를 담을 변수를 만드는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 인스턴스를 생성할 때, instance를 담는 변수에 이미 값이 있다면(인스턴스를 이미 생성했다면) 사용자에게 알리기 위해 에러를 발생시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wfHO9/btrD5SDgB8d/tv58fRyHRmkrMhW3Up1dk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wfHO9/btrD5SDgB8d/tv58fRyHRmkrMhW3Up1dk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wfHO9/btrD5SDgB8d/tv58fRyHRmkrMhW3Up1dk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwfHO9%2FbtrD5SDgB8d%2Ftv58fRyHRmkrMhW3Up1dk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;1496&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1496&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 더 이상 여러 인스턴스를 만들 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부에서 Counter를 사용할 수 있도록 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Object.freeze&lt;/a&gt;를 한 후 내보냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Object.freeze&lt;/a&gt;는 객체 속성의 불변성을 보장합니다. 이렇게 해서 Counter의 속성을 추가하거나 수정할 수 없으므로 싱글턴 클래스를 실수로 변경할 위험을 줄입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Counter Singleton 완성&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFKKF3/btrD8MWywIr/At8qqq4rUok1ueJzBY0Tkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFKKF3/btrD8MWywIr/At8qqq4rUok1ueJzBY0Tkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFKKF3/btrD8MWywIr/At8qqq4rUok1ueJzBY0Tkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFKKF3%2FbtrD8MWywIr%2FAt8qqq4rUok1ueJzBY0Tkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;1490&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 redButton.js, blueButton.js 파일을 만들어 확인해 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 버튼 파일이 Counter를 증가시키고 증가된 counter 상태값이 공유되기 때문에 index.js에 결과가 2가 나오는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;894&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhzR0i/btrD3SjreyK/VksBktCekuWVQv7kazEF31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhzR0i/btrD3SjreyK/VksBktCekuWVQv7kazEF31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhzR0i/btrD3SjreyK/VksBktCekuWVQv7kazEF31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhzR0i%2FbtrD3SjreyK%2FVksBktCekuWVQv7kazEF31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1616&quot; height=&quot;894&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;894&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장단점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인스턴스화를 한 번만으로 제한하면 메모리 공간을 절약할 수 있습니다. 애플리케이션 전체에서 참조되는 한 개의 인스턴스에 대해서만 메모리를 설정하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글턴 인스턴스는 애플리케이션 전체에서 참조할 수 있어야합니다. 글로벌 변수(window, global)도 동일한 동작을 나타냅니다. 하지만 전역변수를 갖는 것은 일반적으로 잘못된 설계로 간주됩니다. 글로벌 범위 오염은 실수로 글로벌 변수 값을 덮어쓰게 되어 예상치 못한 많은 동작을 일으킬 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 코드 베이스의 특정부분은 글로벌 상태 값을 변경하는 반면 다른 부분은 해당 데이터를 소비(사용)합니다. 여기서 중요한 것은 실행순서 입니다. 사용할 데이터가 없을 때 실수로 먼저 데이터를 소비하고 싶지 않다는 것입니다. 글로벌 상태를 사용할 때 데이터의 흐름을 이해하는 것은 애플리케이션의 크기가 증가함에 따라 매우 까다로워 질 수 있으며, 수십개의 컴포넌트가 서로 의존합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;React에서의 상태관리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React에서는 싱글턴을 사용하는 대신 Redux나 React Context 같은 상태 관리 도구를 통해 글로벌 상태에 의존하는 경우가 많습니다. 이러한 글로벌 상태의 동작은 싱글턴의 동작과 비슷해 보이지만 이러한 툴은 싱글턴의 가변(변경가능)상태가 아닌 읽기 전용(readonly) 상태를 제공합니다. Redux를 사용하는 경우 컴포넌트가 dispatcher를 통해 action을 전송한 후 순수함수 reducer만 상태를 업데이트 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 툴을 사용하여 글로벌 상태를 유지하는 것의 단점이 마법처럼 사라지지 않지만 컴포넌트가 직접적으로 상태를 갱신할 수 없기 때문에 적어도 글로벌 상태가 의도한 대로 변경 되도록 할 수 있습니다.&lt;span style=&quot;background-color: #ffffff; color: #6d9eeb;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Reference&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.patterns.dev/posts/singleton-pattern/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.patterns.dev/posts/singleton-pattern/&lt;/a&gt;&lt;/p&gt;</description>
      <category>Web/Patterns</category>
      <category>patterns</category>
      <category>singleton</category>
      <author>연권</author>
      <guid isPermaLink="true">https://dalconbox.tistory.com/323</guid>
      <comments>https://dalconbox.tistory.com/323#entry323comment</comments>
      <pubDate>Tue, 7 Jun 2022 04:52:26 +0900</pubDate>
    </item>
    <item>
      <title>타입 좁히기 (Type Guard)</title>
      <link>https://dalconbox.tistory.com/322</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;타입 좁히기는 타입스크립트를 넓은 타입으로부터 좁은 타입으로 진행하는 과정을 말합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;null 체크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;존재하지 않을 때 null을 반환하는 메소드나 함수의 경우 if 문을 통한 null 체크를 통해 타입 좁히기를 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zKnhE/btrCHOXgJGo/7w7cVfzZOFx9UoWHCyKkFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zKnhE/btrCHOXgJGo/7w7cVfzZOFx9UoWHCyKkFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zKnhE/btrCHOXgJGo/7w7cVfzZOFx9UoWHCyKkFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzKnhE%2FbtrCHOXgJGo%2F7w7cVfzZOFx9UoWHCyKkFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1470&quot; height=&quot;756&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;instanceof&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자의 프로토타입 속성이 객체 프로토타입 체인 어딘가에 존재하는 여부를 확인할 수 있는 instanceof 연산자를 if문과 사용해서 타입을 좁힐 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKLYTW/btrCJuJ00HB/xLSX9Ktl0HgKc1jQktLKd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKLYTW/btrCJuJ00HB/xLSX9Ktl0HgKc1jQktLKd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKLYTW/btrCJuJ00HB/xLSX9Ktl0HgKc1jQktLKd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKLYTW%2FbtrCJuJ00HB%2FxLSX9Ktl0HgKc1jQktLKd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1278&quot; height=&quot;708&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;속성 체크 (in)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로퍼티가 존재하는지 확인할 수 있는 in 연산자를 통해 타입을 좁힐 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chys52/btrCImstoZ2/ISPvKpfsxDOvo6k8l7JaHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chys52/btrCImstoZ2/ISPvKpfsxDOvo6k8l7JaHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chys52/btrCImstoZ2/ISPvKpfsxDOvo6k8l7JaHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchys52%2FbtrCImstoZ2%2FISPvKpfsxDOvo6k8l7JaHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;820&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;내장 함수 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Array.isArray 같이 타입을 판별할 수 있는 내장함수를 사용하여 타입을 좁힐 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PT9uE/btrCJuXztKK/pWOlg2bwJL6rReaYhZssak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PT9uE/btrCJuXztKK/pWOlg2bwJL6rReaYhZssak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PT9uE/btrCJuXztKK/pWOlg2bwJL6rReaYhZssak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPT9uE%2FbtrCJuXztKK%2FpWOlg2bwJL6rReaYhZssak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1296&quot; height=&quot;596&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;tagged union 패턴 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명시적으로 태그를 붙여 타입을 좁힐 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F1lHU/btrCIlG54oY/PzJenCkg6d6GcRzWr7mdnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F1lHU/btrCIlG54oY/PzJenCkg6d6GcRzWr7mdnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F1lHU/btrCIlG54oY/PzJenCkg6d6GcRzWr7mdnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF1lHU%2FbtrCIlG54oY%2FPzJenCkg6d6GcRzWr7mdnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1598&quot; height=&quot;856&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;856&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용자 정의 타입 가드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 식별을 돕기 위한 커스텀 함수를 도입합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWllBf/btrCH37Ie91/y6o1qz5aqCUOliq6mOFIx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWllBf/btrCH37Ie91/y6o1qz5aqCUOliq6mOFIx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWllBf/btrCH37Ie91/y6o1qz5aqCUOliq6mOFIx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWllBf%2FbtrCH37Ie91%2Fy6o1qz5aqCUOliq6mOFIx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1414&quot; height=&quot;820&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Web/TypeScript</category>
      <category>typeguard</category>
      <category>typescript</category>
      <author>연권</author>
      <guid isPermaLink="true">https://dalconbox.tistory.com/322</guid>
      <comments>https://dalconbox.tistory.com/322#entry322comment</comments>
      <pubDate>Sat, 21 May 2022 01:23:38 +0900</pubDate>
    </item>
    <item>
      <title>라인 플러스 면접 후기</title>
      <link>https://dalconbox.tistory.com/321</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래머스의 데브매칭인&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/competitions/2165&quot;&gt;&lt;span style=&quot;background-color: #4caf50; color: #ffffff;&quot;&gt;2022 Dev-Matching: 웹 프론트엔드 개발자(상반기)&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1652450010620&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2022 Dev-Matching: 웹 프론트엔드 개발자(상반기)&quot; data-og-description=&quot;접수 &amp;nbsp; 22년 02월 21일 10:00 ~ 03월 10일 17:00 테스트 &amp;nbsp; 22년 03월 12일 14:00 ~ 03월 12일 17:00&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/competitions/2165&quot; data-og-url=&quot;https://programmers.co.kr/competitions/2165/2022-web-fe-first&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/db2pHv/hyOoDU44OW/3FjKyKT27gY3OtJGjsxkkK/img.png?width=1200&amp;amp;height=628&amp;amp;face=817_330_974_500,https://scrap.kakaocdn.net/dn/bPpi6R/hyOoCu7y5h/ZpbuCZvDC3xGexRPAgHRkk/img.png?width=1200&amp;amp;height=628&amp;amp;face=817_330_974_500,https://scrap.kakaocdn.net/dn/2nCSr/hyOnXOpoEZ/bbBGCewpHCpaB56PjC8QD1/img.png?width=1128&amp;amp;height=636&amp;amp;face=0_0_1128_636&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/competitions/2165&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/competitions/2165&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/db2pHv/hyOoDU44OW/3FjKyKT27gY3OtJGjsxkkK/img.png?width=1200&amp;amp;height=628&amp;amp;face=817_330_974_500,https://scrap.kakaocdn.net/dn/bPpi6R/hyOoCu7y5h/ZpbuCZvDC3xGexRPAgHRkk/img.png?width=1200&amp;amp;height=628&amp;amp;face=817_330_974_500,https://scrap.kakaocdn.net/dn/2nCSr/hyOnXOpoEZ/bbBGCewpHCpaB56PjC8QD1/img.png?width=1128&amp;amp;height=636&amp;amp;face=0_0_1128_636');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2022 Dev-Matching: 웹 프론트엔드 개발자(상반기)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;접수 &amp;nbsp; 22년 02월 21일 10:00 ~ 03월 10일 17:00 테스트 &amp;nbsp; 22년 03월 12일 14:00 ~ 03월 12일 17:00&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 통해서 라인플러스의 면접을 볼 수 있는 기회가 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 지원한 직군은 JavaScript SDK 개발자였기 때문에 이번 기회로 JavaScript와 CS 지식을 다시 볼 수 있는 계기가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접은 비대면으로 진행 됐으면 주로 질문은 자기소개서에 기반한 꼬리질문이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자기소개서에 적혀있는 주된 업무는 JavaScript 였기 때문에 관련 개념 질문이 많이 나왔고 디자인 패턴에 대한 질문이 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 탈락이였고 이번 기회에 모던 자바스크립트 딥다이브 정독하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 자세하게 답변하지 못한 클로저와 이터레이션 프로토콜에 대해서 자세하게 알 수 있게되었고 디자인 패턴에 대해선 아래 사이트를 참고하여 실습을 해보며 체화시킬 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.patterns.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.patterns.dev/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1652450386814&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Patterns.dev - Modern Web App Design Patterns&quot; data-og-description=&quot;Improve how you architect webapps Patterns.dev is a free book on design patterns and component patterns for building powerful web apps with...&quot; data-og-host=&quot;www.patterns.dev&quot; data-og-source-url=&quot;https://www.patterns.dev/&quot; data-og-url=&quot;https://www.patterns.dev/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ijCrR/hyOnNZk5aE/UtyCFLZoT1wJu5bmoeZjQ1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/7SsJ2/hyOoI9VSt7/upQikr89Y4pFmL86RXJ1N0/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/b3ZeAG/hyOnKnZJ6A/b6pFGdSW4wTeppjFzmnhG1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://www.patterns.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.patterns.dev/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ijCrR/hyOnNZk5aE/UtyCFLZoT1wJu5bmoeZjQ1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/7SsJ2/hyOoI9VSt7/upQikr89Y4pFmL86RXJ1N0/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080,https://scrap.kakaocdn.net/dn/b3ZeAG/hyOnKnZJ6A/b6pFGdSW4wTeppjFzmnhG1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Patterns.dev - Modern Web App Design Patterns&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Improve how you architect webapps Patterns.dev is a free book on design patterns and component patterns for building powerful web apps with...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.patterns.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Review</category>
      <category>sdk</category>
      <category>라인플러스</category>
      <category>라인플러스면접</category>
      <category>면접후기</category>
      <author>연권</author>
      <guid isPermaLink="true">https://dalconbox.tistory.com/321</guid>
      <comments>https://dalconbox.tistory.com/321#entry321comment</comments>
      <pubDate>Fri, 13 May 2022 23:00:17 +0900</pubDate>
    </item>
    <item>
      <title>TypeScript Intersection &amp;amp; Union</title>
      <link>https://dalconbox.tistory.com/320</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트의 타입은 타입들의 집합을 표현해 타입의 범위를 명확하게 표현하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드를 Intersection(교집합)을 사용한 코드를 살펴봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Intersection&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uwWF7/btrBgoFP1u5/tfxC5Try6k7DkvKkD1dxzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uwWF7/btrBgoFP1u5/tfxC5Try6k7DkvKkD1dxzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uwWF7/btrBgoFP1u5/tfxC5Try6k7DkvKkD1dxzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuwWF7%2FbtrBgoFP1u5%2FtfxC5Try6k7DkvKkD1dxzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;878&quot; height=&quot;938&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;938&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 코드를 보았을 때 Person은 name을 갖고 있고 Lifespan은 birth와 death 프로퍼티를 갖고 있기 때문에 교집합이 없어서 never(공집합)이라고 생각했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 Union(합집합) 코드도 살펴봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Union&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RpHvm/btrBims1J9m/IRkUXDBTx8kDRwpFcrQep0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RpHvm/btrBims1J9m/IRkUXDBTx8kDRwpFcrQep0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RpHvm/btrBims1J9m/IRkUXDBTx8kDRwpFcrQep0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRpHvm%2FbtrBims1J9m%2FIRkUXDBTx8kDRwpFcrQep0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;410&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합집합이기 때문에 모든 property를 갖고 있어야하지 않나? 생각할 수 있지만 그렇지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;type의 집합이기 때문에 interface를 정의하면 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HXEak/btrBgnAcHm2/HNah2TromJGgDkOK3Fq1T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HXEak/btrBgnAcHm2/HNah2TromJGgDkOK3Fq1T0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HXEak/btrBgnAcHm2/HNah2TromJGgDkOK3Fq1T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHXEak%2FbtrBgnAcHm2%2FHNah2TromJGgDkOK3Fq1T0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1366&quot; height=&quot;856&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;856&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ze2oS/btrBgXg1TLI/26mM230hEDQD3tJ4ZKzj01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ze2oS/btrBgXg1TLI/26mM230hEDQD3tJ4ZKzj01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ze2oS/btrBgXg1TLI/26mM230hEDQD3tJ4ZKzj01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fze2oS%2FbtrBgXg1TLI%2F26mM230hEDQD3tJ4ZKzj01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1486&quot; height=&quot;446&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Web/TypeScript</category>
      <category>Intersection</category>
      <category>typescript</category>
      <category>union</category>
      <author>연권</author>
      <guid isPermaLink="true">https://dalconbox.tistory.com/320</guid>
      <comments>https://dalconbox.tistory.com/320#entry320comment</comments>
      <pubDate>Wed, 4 May 2022 23:40:31 +0900</pubDate>
    </item>
    <item>
      <title>no matching manifest for linux/arm64/v8 in the manifest list entries 에러 해결</title>
      <link>https://dalconbox.tistory.com/319</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;docker-compose up을 하던 중 에러가 발생했다.&lt;/p&gt;
&lt;pre id=&quot;code_1650541373750&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;no matching manifest for linux/arm64/v8 in the manifest list entries&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M1에서 docker를 사용시 발생하는 문제이며 &lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;platform을 명시해주면 해결이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1650541498611&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;platform: linux/x86_64&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIVEEq/btrz7AywrFI/5sq3n2KTDW15jVcE9YOQ1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIVEEq/btrz7AywrFI/5sq3n2KTDW15jVcE9YOQ1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIVEEq/btrz7AywrFI/5sq3n2KTDW15jVcE9YOQ1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIVEEq%2Fbtrz7AywrFI%2F5sq3n2KTDW15jVcE9YOQ1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;744&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Infra&amp;amp;DevOps</category>
      <category>docker 에러</category>
      <category>docker-compose</category>
      <category>m1 에러</category>
      <author>연권</author>
      <guid isPermaLink="true">https://dalconbox.tistory.com/319</guid>
      <comments>https://dalconbox.tistory.com/319#entry319comment</comments>
      <pubDate>Thu, 21 Apr 2022 20:45:29 +0900</pubDate>
    </item>
    <item>
      <title>프로토타입</title>
      <link>https://dalconbox.tistory.com/318</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 프로토타입 기반의 객체지향 프로그래밍 언어다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클래스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;es6에서 클래스가 도입되었다. 클래스도 함수이며, 기존 프로토타입 기반 패턴의 문법적 설탕이라고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스는 생성자 함수보다 엄격하며 생성자 함수에서는 제공하지 않는 기능도 제공한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;__&lt;b&gt;proto__접근자 프로퍼티&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 객체는 &lt;b&gt;proto&lt;/b&gt; 접근자 프로퍼티를 통해 자신의 프로토타입, 즉 [[Prototype]] 내부 슬롯에 간접적으로 접근할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 슬롯은 프로퍼티가 아니며 일부 내부 슬롯과 내부 메서드에 한하여 간접적으로 접근할 수 있는 수단을 제공하기는 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;proto&lt;/b&gt; 접근자 프로퍼티를 코드 내에서 직접 사용하는 것은 권장하지 않는다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object.protytpe을 상속받지 않는 객체를 생성할 수또 있기 때문에 &lt;b&gt;proto&lt;/b&gt; 접근자 프로퍼티를 사용할 수 없는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;proto&lt;/b&gt; 접근자 프로퍼티 대신 참조를 취득하고 싶은 경우에는 Object.getPrototypeOf 메서드를 사용하고, 프토토타입을 교체하고 싶은 경우에는 Object.setPrototypeOf 메서드를 사용할 것을 권장한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 객체의 prototype 프로퍼티&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 객체만이 소유하는 prototype 프로퍼티는 생성자 함수가 생성할 인스턴스의 프로토타입을 가리킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 객체가 가지고 있는(엄밀히 말하면 Object.prototype으로부터 상속받은) &lt;b&gt;proto&lt;/b&gt; 접근자 프로퍼티와 함수 객체만이 가지고 있는 protytype 프로퍼티는 결국 동일한 프로토타입을 가리킨다. 하지만 프로퍼티를 사용하는 주체가 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 소유 값 사용 주체 사용 목적&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;proto&lt;/b&gt; 접근자 프로퍼티&lt;/td&gt;
&lt;td&gt;모든 객체&lt;/td&gt;
&lt;td&gt;프로토타입의 참조&lt;/td&gt;
&lt;td&gt;모든 객체&lt;/td&gt;
&lt;td&gt;객체가 자신의 프로토타입에 접근 또는 교체하기 위해 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prototype 프로퍼티&lt;/td&gt;
&lt;td&gt;constructor&lt;/td&gt;
&lt;td&gt;프로토타입의 참조&lt;/td&gt;
&lt;td&gt;생성자 함수&lt;/td&gt;
&lt;td&gt;생성자 함수가 자신이 생성할 객체(인스턴스)의 프로토타입을 할당하기 위해 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로토타입 체인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 객체의 프로퍼티(메서드 포함)에 접근하려고 할 때 해당 객체에 접근하려는 프로퍼티가 없다면 [[Prototype]] 내부 슬롯의 참조를 따라 자신의 부모 역할을 하는 프로토타입의 프로퍼티를 순차적으로 검색한다. 이를 프로토타입 체인이라 한다. 프로토타입 체인은 자바스크립트가 객체지향 프로그래밍의 상속을 구현하는 매커니즘이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object.prototype을 프로토타입 체인의 종점(end of prototype chain)이라 한다. Object.prototype의 프로토타입, 즉 [[Prototype]] 내부 슬롯의 값은 null이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토타입 체인은 상속과 프로퍼티 검색을 위한 매커니즘.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스코프 체인은 식별자 검색을 위한 매커니즘.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오버라이딩과 프로퍼티 섀도잉&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토타입 프로퍼티와 같은 이름의 프로퍼티를 인스턴스에 추가하면 프로토타입 체인을 따라 프로토타입 프로퍼티를 검색하여 프로토타입 프로퍼티를 덮어쓰는 것이 아니라 인스턴스 프로퍼티로 추가한다. 이때 인스턴스 메서드는 프로토타입 메서드를 오버라이딩 했고 프로토타입 메서드는 가려진다. 이처럼 상속 관계에 의해 프로퍼티가 가려지는 현상을 프로퍼티 섀도잉이라한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;instanceof 연산자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우변의 생성자 함수의 prototype에 바인딩된 객체가 좌변의 객체의 프로토타입 체인 상에 존재하면 true로 평가되고, 그렇지 않은 경우에는 false로 평가된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자 함수의 prototype에 바인딩된 객체가 프로토타입 체인 상에 존재하는지 확인한다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function Person(name) {
	this.name;
}

const me = new Person('Lee');
console.log(me instanceof Person); // true
console.log(me instanceof Object); // true
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;for ... in 문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체의 모든 프로퍼티를 순위하며 열거하려면 for...in문을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for...in 문은 순회 대상 객체의 프로퍼티뿐만 아니라 상속받은 프로토타입의 프로퍼티까지 열거한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for...in 문은 객체의 프로토타입 체인 상에 존재하는 모든 프로토타입의 프로퍼티 중에서 프로퍼티 어트리뷰트 [[Enumerable]]의 값이 true인 프로퍼티를 순회하며 열거한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상속받은 프로퍼티는 제외하고 객체 자신의 프로퍼티만 열거하려면 Object.prototype.hasOwnProperty 메서드를 사용하여 객체 자신의 프로퍼티인지 확인해야 한다.&lt;/p&gt;</description>
      <category>Web/JavaScript</category>
      <category>Prototype</category>
      <category>모던 자바스크립트 딥다이브</category>
      <author>연권</author>
      <guid isPermaLink="true">https://dalconbox.tistory.com/318</guid>
      <comments>https://dalconbox.tistory.com/318#entry318comment</comments>
      <pubDate>Thu, 14 Apr 2022 11:39:15 +0900</pubDate>
    </item>
    <item>
      <title>렉시컬 스코프</title>
      <link>https://dalconbox.tistory.com/317</link>
      <description>&lt;pre id=&quot;code_1649399565065&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var x = 1;

function foo() {
	var x = 10;
    bar();
}

function bar() {
	console.log(x);
}

foo(); // ?
bar(); // ?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제의 실행 결과는 bar 함수의 상위 스코프가 무엇인지에 따라 결정된다. 두 가지 패턴을 예측할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;b&gt;함수를 어디서 호출했는지&lt;/b&gt;에 따라 함수의 상위 스코프를 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;함수를 어디서 정의했는지&lt;/b&gt;에 따라 함수의 상위 스코프를 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 방식으로 함수의 상위 스코프를 결정한다면 bar 함수의 상위 스코프는 foo함수의 지역 스코프와 전역 스코프일 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식을 &lt;b&gt;동적 스코프&lt;/b&gt;라 한다. 함수가 호출되는 시점에 동적으로 상위 스코프를 결정해야 하기 때문에 동적 스코프라 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 방식으로 함수의 상위 스코프를 결정한다면 bar 함수의 상위 스코프는 전역스코프일 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식을 &lt;b&gt;렉시컬 스코프&lt;/b&gt; 또는 &lt;b&gt;정적 스코프&lt;/b&gt;라 한다. 동적 스코프 방식처럼 상위 스코프가 동적으로 변하지 않고 함수가 정의가 평가되는 시점에 상위 스코프가 정적으로 결정되기 때문에 정적 스코프라고 부른다. 자바스크립트를 비롯한 대부분의 프로그래밍 언어는 렉시컬 스코프를 따른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 위 예제를 실행하면 전역 변수 x의 값 1을 두 번 출력한다.&lt;/p&gt;</description>
      <category>Web/JavaScript</category>
      <category>렉시컬 스코프</category>
      <author>연권</author>
      <guid isPermaLink="true">https://dalconbox.tistory.com/317</guid>
      <comments>https://dalconbox.tistory.com/317#entry317comment</comments>
      <pubDate>Fri, 8 Apr 2022 15:39:35 +0900</pubDate>
    </item>
    <item>
      <title>라인 피드와 캐리지 리턴</title>
      <link>https://dalconbox.tistory.com/316</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;IDE(VSCode)로 협업하며 개발을 하다 보면 문제가 없는 코드에 lint error 밑줄이 그어져 있는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 서로 운영체제가 달라서 그런데 Windows의 경우는 CRLF macOS는 LF를 사용하기 때문에 그렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LF는 라인 피드, CR을 캐리지 리턴을 의미하는데, 캐리지 리턴(\r)은 종리를 움직이지 않고 커서를 맨 앞줄로 이동하는 것이다. 초창기 컴퓨터는 출력을 프린터로 수행했는데, 이때 개행을 위해 라인피드와&amp;nbsp; 캐리지 리턴을 모두 사용했다. 즉, CRLF(\r\n)로 커서를 맨 앞으로 이동시키고 종이를 한 줄 올리는 방식으로 개행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 라인 피드와 캐리지 리턴은 모두 개행을 의미한다. 하지만 캐리지 리턴(/r)으로 개행하는 경우는 거의 없고 일반적으로 라인피드(\n)를 사용해 개행한다.&lt;/p&gt;</description>
      <category>Web/JavaScript</category>
      <category>라인 피드와 캐리지 리턴</category>
      <author>연권</author>
      <guid isPermaLink="true">https://dalconbox.tistory.com/316</guid>
      <comments>https://dalconbox.tistory.com/316#entry316comment</comments>
      <pubDate>Thu, 7 Apr 2022 00:18:04 +0900</pubDate>
    </item>
  </channel>
</rss>