<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>devfrank.log</title>
        <link>https://velog.io/</link>
        <description>피드백 문화를 지향합니다. Anytime please!  🙌🏻</description>
        <lastBuildDate>Wed, 12 Apr 2023 06:05:41 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>devfrank.log</title>
            <url>https://velog.velcdn.com/images/frank_kim/profile/292e9f80-41e2-4d25-8a10-db9a115a1392/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. devfrank.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/frank_kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Github] - issue 템플릿 추가]]></title>
            <link>https://velog.io/@frank_kim/Github-issue-%ED%85%9C%ED%94%8C%EB%A6%BF-%EC%B6%94%EA%B0%80</link>
            <guid>https://velog.io/@frank_kim/Github-issue-%ED%85%9C%ED%94%8C%EB%A6%BF-%EC%B6%94%EA%B0%80</guid>
            <pubDate>Wed, 12 Apr 2023 06:05:41 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/frank_kim/post/2ac347af-dcd5-468a-8e04-a7e0d4984d08/image.png" alt=""></p>
<h2 id="issue-템플릿을-써야하는-이유">issue 템플릿을 써야하는 이유</h2>
<blockquote>
<p><strong>커뮤니케이션 규칙 수립하기.</strong></p>
</blockquote>
<p>소통과 대화는 다르다. 소통과 대화의 가장 큰 차이는 합의점을 이끌어내는 것에 있다고 생각한다.</p>
<p><strong>&quot;소통&quot;</strong>을 잘한다는 것은, <strong>&quot;합의점&quot;</strong>을 <strong>잘.찾.는.것</strong> 이라고 생각한다.</p>
<p>단순히 &quot;어떤 기능을 해주세요.&quot;라고 채팅이나 말로 요청하면, 요청받는 개발자는 해당 요구사항에 대한 완벽한 이해가 어렵다. 동료들 마다 질문하는 스타일과 요청하는 방법이 다르므로, 여러명이 협업을 한다면 골치가 아플 수 있다. </p>
<p>이를 위해, Github에서 제공하는 issue 템플릿을 사용하면 일관성있게 요청을 받아서 프로젝트 생산성과 정신건강에 도움이 될 수 있다. </p>
<hr>
<h3 id="👏🏻-이슈-템플릿-강점">👏🏻 이슈 템플릿 강점</h3>
<ul>
<li>comment, merge, issue 생성을 할 때, 알림 기능을 받을 수 있다.</li>
<li>중요한 업데이트나 변경 사항에 대해 팀 전체에게 알림을 보낼 수 있다.</li>
<li>타프로그램과 연동이 잘된다. ex) 마이크로소프트 팀즈</li>
</ul>
<p>이를 통해, 버그 리포트에 대해 더 빠르고 효과적으로 대응할 수 있다. 효율적인 커뮤니케이션을 지원하고, 이슈 작성자들이 일관된 방식으로 이슈를 작성할 수 있도록 도와준다.</p>
<hr>
<h3 id="⚒️-이슈issue-템플릿-등록하는-방법">⚒️ 이슈(ISSUE) 템플릿 등록하는 방법</h3>
<ol>
<li>해당 프로젝트 Repository를 들어간다.</li>
<li>Settings 들어간다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/f85335af-0f43-4fc0-930c-efc55ccd0f13/image.png" alt=""></p>
<ol start="3">
<li>Set up templates를 누른다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/bfd5d734-edc7-401d-ae85-f9a8b41ca30e/image.png" alt=""></p>
<ol start="4">
<li>Bug report, Feature request or Custom template을 이용해 규칙을 만든다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/ec166075-adeb-474c-a141-d5f77584c762/image.png" alt=""></p>
<ol start="5">
<li>규칙 만들고, Propose Changes 누르면 템플릿이 완성된다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/c208ef69-fea1-425c-8ad1-88aa58f1f5f1/image.png" alt=""></p>
<ol start="6">
<li>이제 issue를 들어가서, New issue를 생성하게 되면 본인이 만든 템플릿을 볼 수 있다. </li>
</ol>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/ac19763f-8d38-4f80-b51e-b2c0fd8332eb/image.png" alt=""></p>
<hr>
<h3 id="마무리">마무리</h3>
<p>소통을 잘하자 👏🏻</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[피그마 Figma] - 배우는 이유 #1 ]]></title>
            <link>https://velog.io/@frank_kim/%ED%94%BC%EA%B7%B8%EB%A7%88-Figma-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0-1</link>
            <guid>https://velog.io/@frank_kim/%ED%94%BC%EA%B7%B8%EB%A7%88-Figma-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0-1</guid>
            <pubDate>Tue, 11 Apr 2023 10:43:53 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/frank_kim/post/c86c6265-16b0-43de-a626-48cf8bbbe2c4/image.png" alt=""></p>
<h3 id="피그마figma-장점">피그마(Figma) 장점</h3>
<ul>
<li>Figma는 클라우드 기반으로 작동하고, 실시간 저장이 가능하다.</li>
<li>Figma는 웹, 모바일, 데스크탑 등 다양한 플랫폼에서 작동하므로, 언제 어디서나 작업할 수 있다.</li>
<li>무료 버전에서도 많은 기능을 사용할 수 있다. 유료 버전에서는, 많은 라이브러리도 제공되는 듯 하다.</li>
<li>여러 사람이 동시에 작업하면서 코멘트나 리뷰를 남길 수 있고, 파일도 공유할 수 있다.</li>
<li>와이어프레임 작성이 가능하다.</li>
</ul>
<h3 id="궁긍적으로-배우고-싶은-이유">궁긍적으로 배우고 싶은 이유</h3>
<p><em><strong>소통하기 위함이다.</strong></em></p>
<p>디자이너, 기획자, 동료 개발자들과 이야기 할때, 두서 없이 이야기 하면 서로 머리가 아프다. 소통의 부재가 발생할 확률이 매우 높다.</p>
<p>예를 들어 A 동료가, &quot;개발자, 디자이너, 퍼블리셔에게 그래프 컴포넌트를 양 옆으로 옮겨주세요.&quot; 라고 한다면 가장 무엇부터 생각할까? 
나는... 어떤 컴포넌트를... 어디쪽 그래프에서... 어디 방향으로 옮기라는거지? 생각할것이다.</p>
<p>위에 말만 듣고....</p>
<ul>
<li>프런트 개발에 수정이 필요하다면?</li>
<li>디자인의 수정작업이 필요하다면? </li>
<li>퍼블리싱 작업에서 수정작업이 필요하다면? </li>
</ul>
<p>직관적인 디자인과 문서화를 이용하여, 요구사항을 정확하게 컨펌한 후, 작업하는것이 생산성과 정신 건강에 훨씬 좋을 것 같다. 피그마를 사용하여 엄청난 디자인이너가 되면 좋겠지만, 이것이 나의 목표는 아니다. 기본 툴의 사용과 친해지는 것이 1차 목표다. 2차 목표는, 피그마로 디자이너 및 동료들과 소통하기. 3차 목표 지식 공유하기. </p>
<p>A같은 동료가 되지 않기 위해 노력하고 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS] 호이스팅, 스코프, var - let - const, TDZ 끝장]]></title>
            <link>https://velog.io/@frank_kim/JS-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-%EC%8A%A4%EC%BD%94%ED%94%84-var-let-const-TDZ-%EB%81%9D%EC%9E%A5</link>
            <guid>https://velog.io/@frank_kim/JS-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-%EC%8A%A4%EC%BD%94%ED%94%84-var-let-const-TDZ-%EB%81%9D%EC%9E%A5</guid>
            <pubDate>Thu, 09 Feb 2023 12:32:52 GMT</pubDate>
            <description><![CDATA[<p>*<em>자바스크립트 단골 면접 질문 - 호이스팅, var vs let vs const에 대해서 아는 데로 설명해주시겠어요? *</em></p>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/500b2650-47bc-47eb-b9c7-232f23c1278d/image.png" alt=""></p>
<h2 id="호이스팅hoisting이란">호이스팅(Hoisting)이란?</h2>
<p>구글 영어사전에 따르면 호이스팅이란 *<em>밧줄과 도르래로 끌어올리다는 뜻. *</em></p>
<blockquote>
<p>: raise (something) by means of ropes and pulleys.
&quot;high overhead great cranes hoisted girders&quot;</p>
</blockquote>
<p>Simple Korean으로 말하면, 이사짐 사다리를 사용해서 63빌딩 꼭대기 층으로 위로 올라가는 것. </p>
<pre><code class="language-js">aCatName(&quot;호랑이&quot;);

function aCatName(name) {
  console.log(&quot;고양이의 이름은 &quot; + name + &quot;입니다&quot;); 
  // 고양이의 이름은 호랑이입니다
}</code></pre>
<p>일반적으로 코드는 탑다운 방식으로 실행이 된다. 
위의 예제를 보면 함수를 <strong>선언하기도 전에</strong>, 함수를 먼저 호출하는데도 문제가 없다. 콘솔이 잘 찍힌다.</p>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/025fd634-8b2c-4b48-9cd2-f2f87d83dd29/image.png" alt=""></p>
<p>debugger를 확인해보면, 실행도 전에 호이스팅을 하여 Global에 aCatName 함수가 담긴것을 볼 수 있다. <strong>여기서 우리가 &#39;아하&#39;라고 생각돼야 하는 부분은, 함수가 실행도 전에 꼭대기 층으로 올라가서 어딘가에 저장된다는 것이다. 이게 호이스팅이다.</strong> </p>
<p>자연스럽게 우리에게 말도하지 않고, 63빌딩 꼭대기로 쭈욱 올라간다는 것.</p>
<p>그렇다. 호이스팅은 코드를 실행하기도 전에, 선언된 변수 및 함수를 해당 범위의 맨 위로 이동하는 JavaScript의 메커니즘이다.</p>
<blockquote>
<p>함수 선언문이 아닌 함수 표현식과 화살표 함수는 호이스팅이 될까? </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/2b5eafeb-dd2f-4e6e-a4c2-bdbfd90f4bd9/image.png" alt=""></p>
<ul>
<li>호이스팅을 시도하지만, 함수 표현식과 화살표 함수는 다른 방법으로 define을 한다.</li>
</ul>
<p>&quot;The context inside arrow functions is lexically or statically defined. &quot; - </p>
<hr>

<h3 id="호이스팅-var-let-const">호이스팅 var, let, const</h3>
<p>몇 블로그 글을 보면... 누군가는 var는 호이스팅이 되는데 let과 const는 호이스팅이 되지 않는다는... 얘기를 한다. 까짓거 그럼 debugger를 사용해서, 자바스크립트 엔진에게 물어보자.</p>
<ul>
<li><p>var 키워드
<img src="https://velog.velcdn.com/images/frank_kim/post/4badc2c8-5b2b-4484-9915-e3629b047295/image.png" alt=""></p>
</li>
<li><p>let, const 키워드
<img src="https://velog.velcdn.com/images/frank_kim/post/2d7610d7-1fea-4463-9588-a261c600105a/image.png" alt=""></p>
</li>
</ul>
<blockquote>
</blockquote>
<p>**
결론: var, let, const 코드를 실행하기도 전에, 선언된 변수 및 함수를 위로 쭈욱<del>~</del>
**</p>
<hr>

<p><img src="https://velog.velcdn.com/images/frank_kim/post/9b0c4fe6-ab12-47fe-8e79-cbba70395633/image.png" alt=""></p>
<h2 id="스코프의-반란-let-const">스코프의 반란 let, const</h2>
<blockquote>
<p><strong>스코프(scope): 변수에 접근할 수 있는 범위</strong></p>
</blockquote>
<h3 id="함수-스코프">함수 스코프</h3>
<ul>
<li><strong>자바스크립트는 기본적으로 함수 스코프를 따르는 언어다.</strong></li>
<li>함수스코프를 따른다? ===&gt; 새로운 함수가 생성될때마다 새로운 스코프가 발생한다.</li>
<li>함수안에서 선언한 변수는 해당 함수 안에서만 접근할 수 있음.
(함수스코프 -&gt; 지역스코프)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/4fde8041-841d-4fbd-9a4b-2eb41201341b/image.png" alt=""></p>
<pre><code class="language-js">function getPassword() {
    var secretKey = &#39;12345&#39;;
}

getPassword();
console.log(secretKey); // ReferenceError - not defined</code></pre>
<blockquote>
<p><strong>함수 외부는 Global scope이고, 함수 내부는 <code>getPassword 함수</code>의 scope이다. 부모 scope는 자식 scope에서 간섭할 수 없기 때문에 접근이 불가능하다.</strong></p>
</blockquote>
<p>그렇다면 var 키워드를 사용할 때, 블락{ } 에서는? </p>
<pre><code class="language-js">// ========= 블락 {} =========
var secretKey = &quot;123456&quot;;

if (true) {
  var secretKey = &quot;var changes inside block - Not safe&quot;;
}

console.log(secretKey); // var changes inside block - Not safe</code></pre>
<ul>
<li>위 코드에서는 함수가 선언되어 있지 않기 때문에 새로운 환경, 새로운 스코프가 형성되지 않는다. 두꺼운 벽을 세우지 않았다.</li>
<li>그렇기 때문에 어디에서나 secretKey에 접근이 가능하다.</li>
<li><strong>Simple Korean - var 키워드는 함수에서만 도둑을 조심하고, 벽은 타고 집안으로 들어온다.</strong></li>
</ul>
<blockquote>
<p>대표적인 예로, for loop의 블락스코프다.
블락에서 보호를 제대로 받지 못하여, 다른 스코프(범위)에서 키워드를 남발할 수 있다.</p>
</blockquote>
<pre><code class="language-js">for (var password = 0; password &lt; 2; password++){
    console.log(password); // 0, 1
}
&gt;
console.log(password); // 2 
// 블락스코프 밖에서... password를 선언하지도 않았는데, i에 접근해버렸다..</code></pre>
<p>var 키워드를 남발한다면... 나도 모르게 변수를.. 재사용하여.. 이거저것 해본 후... 어디선가.. 버그를 찾고 있겠지...?</p>
<p>*<em>Simple Korean: 도둑이 이집 저집 마음대로 넘나들면 안되니까 벽을 세워야함.
*</em>
이를 위해, 도둑이 넘나들지 못하게 벽을 세우자! ES6에서 <code>블락스코프 let, const 키워드</code>가 등장했다.</p>
<hr> 

<h3 id="블락-스코프-let-const-키워드">블락 스코프 let, const 키워드</h3>
<ul>
<li>원래 자바스크립트는 함수 스코프를 따르지만, let과 const 키워드의 등장으로 블락 스코프를 형성하는 것도 가능해졌다. (드디어 안전한 벽을 세울 수 있다.)</li>
<li>블락스코프는, 블락 {}이 생성될 때마다 새로운 스코프(범위)가 형성되는 것을 의미함.</li>
</ul>
<pre><code class="language-js">let secretKey = &quot;Let me hack your password&quot;;

if(true){
    let secretKey = &quot;Go away&quot;;
    console.log(secretKey); // &quot;Go away&quot;;

      const password = &quot;*******&quot;
      console.log(password); // &quot;*******&quot;
}

console.log(secretKey); // Let me hack your password
console.log(password); // ReferenceError - password is not defined</code></pre>
<p>let과 const를 사용하여 도둑이 집을 넘나드는것을 안전한 벽(블락)을 세우며 침입을 막는다.</p>
<hr>

<h2 id="선언--초기화--값-할당--재할당">선언 &amp; 초기화 &amp; 값 할당 &amp; 재할당</h2>
<p>앞서, 호이스팅를 확인하고 중요한 함수스코프와 블락스코프의 차이를 확인했다. 그렇다면 var, let, const 쓰임새는 어떻게 될까?</p>
<ul>
<li><strong>변수는 선언 단계 -&gt; 초기화 단계 -&gt; 값 할당단계 3가지 단계로 나뉜다.</strong></li>
</ul>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/67c8e3f2-3cbc-4854-bc23-dda9dd29111a/image.png" alt=""></p>
<p>앞에서도 살펴봤지만, 다시 위의 사진을 보면, let과 const를 사용할때, 호이스팅이 돼서 메모리 어딘가에 <code>undefined</code> 로 먼저 들어가 있는 것을 확인할 수 있다. 이뿐만이 아니다, 개발자 도구에서 함수를 정의해도 undefined가 뜬다.</p>
<ul>
<li>let, const는 호이스팅 때 메모리 공간만 할당하여 <code>undefined</code>를 넣어두려고 시도한다.</li>
</ul>
<blockquote>
<p><strong>Simple Korean으로 설명을 하자면,</strong></p>
</blockquote>
<p><strong>1. 변수 선언.
2. 초기화라는건 =&gt; 메모리 공간을 미리 만들어 둔다는 것이다. 보통 암묵적으로 &#39;undefined&#39;을 넣으려고함.
3. 초기화 단계에서 만들어 놓은 메모리 공간을 활용하여 =&gt; 값을 할당 및 재할당 한다.</strong></p>
<h3 id="var">var</h3>
<ul>
<li>var는 선언 &amp; 초기화 &amp; 값 할당을 동시에도 가능하고, 따로도 가능하다.  따로 하는 작업을 한다면, 메모리 공간을 만들어 <code>undefined</code>로 넣어두고 다음 테스크를 기다린다.</li>
</ul>
<pre><code class="language-js">var whatever; // undefined
var whatever = &#39;1&#39; // 재선언 가능
var whatever = &#39;2&#39; // 재할당 가능</code></pre>
<h3 id="let">let</h3>
<ul>
<li>호이스팅 이후 코드가 실행되며, let은 <code>undefined</code>에서 나중에 재할당을 할 수 있다. 즉, 선언과 초기화 분리가 가능하다. </li>
<li>중복 선언이 안된다.</li>
</ul>
<pre><code class="language-js">let laterPossible; // undefined
laterPossible = &quot;changing the value&quot;

let laterPossible = &#39;declared again&#39;; // 중복선언 안됨.
// Identifier &#39;laterPossible&#39; has already been declared</code></pre>
<h3 id="const">const</h3>
<ul>
<li>호이스팅이 되며, undefined가 담기려고 노력하지만, 선언 &amp; 초기화 &amp; 할당이 동시에 일어나야 한다.</li>
<li>중복선언 안됨.</li>
<li>const 만에 유니크함: =&gt; 재할당이 불가함.(예외도 있음)</li>
<li>*<em>재할당의 경우, 원시 값은 불가능하지만, 객체는 가능하다. *</em></li>
<li><strong>const 키워드는 재할당을 금지할 뿐, &#39;불변&#39;을 의미하지 않는다.</strong></li>
</ul>
<pre><code class="language-js">const strictBetter; // Missing initializer in const declaration
// 1. 선언할때, 2. 초기화를 꼭 하고, 값도 할당해줘야한다.

const strictBetter = &#39;value in the memory&#39; //  선언 &amp; 초기화 &amp; 값 할당

const strictBetter = &#39;re-declare&#39;; // 중복선언 안됨.
// Identifier &#39;re-declare&#39; has already been declared

strictBetter = &#39;new string&#39;; //  Assignment to constant variable</code></pre>
<ul>
<li>재할당 예외<pre><code class="language-js">const exceptionConst = {id:1, name: &#39;Frank&#39;}
</code></pre>
</li>
</ul>
<p>exceptionConst[&#39;name&#39;] = &#39;Frank Kim&#39;
exceptionConst[&#39;job&#39;] = &#39;JavaScript Developer&#39;</p>
<p>console.log(exceptionConst); 
// {id: 1, name: &#39;Frank Kim&#39;, job: &#39;JavaScript Developer&#39;}</p>
<pre><code>
&lt;hr&gt;

### TDZ란? 사각지대

&gt; Temporal Dead Zone: =&gt; ReferenceError

(1) let

* let 키워드로 선언한 변수는, 선언 단계와 초기화 단계가 분리되어 진행된다. 즉, 런타임 이전에 자바스크립트 엔진에 의해 선언 단계가 먼저 실행되지만, 초기화 단계가 적절하게 실행되지 않았을 때(undefined) 해당 변수에 접근하려고 하면 참조 에러가 뜬다.

```js
console.log(name); // Uncaught ReferenceError: name is not defined
/*
......
...... T
...... D
...... Z
......
*/
let name = &#39;Frank&#39;</code></pre><ul>
<li>따라서 let 키워드로 선언한 변수는 스코프의 시작 지점부터 초기화 단계 시작 지점까지 변수를 참조할 수 없는 일시적 사각지대(Temporal Dead Zone: TDZ) 구간에 존재한다.</li>
</ul>
<p>(2) const</p>
<p>const 키워드는 선언 단계와 초기화 단계가 동시에 진행된다.</p>
<pre><code class="language-js">console.log(name) 
// Uncaught ReferenceError: Cannot access &#39;name&#39; before initialization

const name = &#39;Frank&#39;</code></pre>
<ul>
<li><p>let 키워드로 선언한 경우, 런타임 이전에 선언이 되어 자바스크립트 엔진에 이미 존재하지만 초기화가 적절하게 되지 않았기 때문에, name is not defined라는 문구가 떴다. </p>
</li>
<li><p>하지만 const 키워드로 선언한 경우, 선언과 초기화가 동시에 이루어져야 하지만 런타임 이전에는 실행될 수 없다. 따라서 초기화가 진행되지 않은 상태이기 때문에 Cannot access &#39;name&#39; before initialization 에러 문구가 뜬다.</p>
</li>
</ul>
<hr>

<h2 id="마무리">마무리</h2>
<p>기본적으로 변수의 스코프는 최대한 좁게 만드는 것을 권장한다. 
따라서, var &gt; <strong>let &gt; const 키워드</strong>를 사용하자. 
<strong>변경하지 않는 값(상수)이라면 let &gt; const 키워드</strong>를 사용하는 것이 상대적으로 안전한다.</p>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/37161a7e-a3d2-43f5-bb01-18ade5648706/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/5e654143-d36b-4717-a6f6-5d95fb288af0/image.png" alt=""></p>
<p>Reference: </p>
<ul>
<li><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/let#%EC%8B%9C%EA%B0%84%EC%83%81_%EC%82%AC%EA%B0%81%EC%A7%80%EB%8C%80">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/let#%EC%8B%9C%EA%B0%84%EC%83%81_%EC%82%AC%EA%B0%81%EC%A7%80%EB%8C%80</a></li>
<li><a href="https://www.geeksforgeeks.org/can-we-use-hoisting-with-arrow-function/?ref=rp">https://www.geeksforgeeks.org/can-we-use-hoisting-with-arrow-function/?ref=rp</a></li>
<li><a href="https://www.howdy-mj.me/javascript/var-let-const">https://www.howdy-mj.me/javascript/var-let-const</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS] 원시타입 vs 참조타입 ]]></title>
            <link>https://velog.io/@frank_kim/JS-%EC%9B%90%EC%8B%9C%ED%83%80%EC%9E%85-vs-%EC%B0%B8%EC%A1%B0%ED%83%80%EC%9E%85</link>
            <guid>https://velog.io/@frank_kim/JS-%EC%9B%90%EC%8B%9C%ED%83%80%EC%9E%85-vs-%EC%B0%B8%EC%A1%B0%ED%83%80%EC%9E%85</guid>
            <pubDate>Tue, 07 Feb 2023 11:48:02 GMT</pubDate>
            <description><![CDATA[<p>call by value와 call by reference를 학습하는 과정중에, 원시타입(Primitive Type)과 참조타입(Reference Type)을 더 자세히 학습하고자 한다.</p>
<p>목표: 누군가를 위해 Simple Korean으로 설명할 수 있을만큼 학습하기.</p>
<h2 id="자바스크립트-변수-타입">자바스크립트 변수 타입</h2>
<p>자바 스크립트의 변수 타입에는 크게 원시타입(Primitive Type)과 참조타입(Reference Type)으로 나누어져 있다. </p>
<ul>
<li><p>원시타입(Primitive type)의 변수들은 데이터 복사가 일어날 때 메모리 공간을 새로 확보하여 독립적인 값을 저장한다.</p>
</li>
<li><p>참조 타입은 메모리에 직접 접근이 아닌 메모리의 공간(주소)에 대한 간접적인 참조를 통해 메모리에 접근하는 데이터 타입이다.</p>
</li>
</ul>
<h3 id="참조타입-메모리-주소-값-접근---heap">참조타입 (메모리 주소 값 접근 - Heap)</h3>
<p>배열과 객체, 그리고 함수가 대표적이다. </p>
<ul>
<li>Object의 데이터 자체는 <strong>별도의 메모리 공간(heap)에 저장된다.</strong></li>
<li>변수에 할당 시 데이터에 대한 <strong>주소(힙(Heap) 메모리의 주소값)가 저장</strong>된다. </li>
<li>따라서, 자바스크립트 엔진은 변수가 가지고 있는 <strong>메모리 주소를 이용해서 변수의 값에 접근</strong>한다.</li>
</ul>
<p>Simple Korean으로 말하면, </p>
<ul>
<li>배열이나 객체는 크기가 커질 수 있기 때문에  데이터를 큰 상자 공간(메모리 공간 - Heap)에 저장한다.
또한, 우리가 큰 상자안에 있는 데이터에 접근하려면 unique한 이름이(메모리 주소) 있으면 좋겠다.
마치 100세대가 사는 아파트에, 택배를 전달하려면 특정 주소(Heap)가 필요하다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/47ee89f9-f325-42ee-bc98-a5b2524fe340/image.png" alt=""></p>
<blockquote>
<p>만약에,<code>let myArray = []</code> 라는 배열을 생성하면 위와 같은 일이 일어난다. 그림에서 볼 수 있듯이, 원시타입(문자, 숫자)의 값들은 <strong>&#39;값 - value&#39;</strong>들이 직접적으로 저장되어 있다. (자세한 원시타입은 아래에 설명함.)
<strong>BUT</strong> myArray (<strong>참조타입</strong>)는 ---&gt; Heap <strong>메모리의 주소값</strong>이 저장되어 있다.</p>
</blockquote>
<pre><code class="language-js">let myArr = [];
let copyArr = myArr;

myArr.push(&quot;hello&quot;);

console.log(copyArr); // [&quot;hello&quot;]</code></pre>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/db0918b8-d12f-4394-9d87-c38fa5b43ce6/image.png" alt=""></p>
<p>위 예제를 보면 알 수 있듯이, 참조 타입의 변수는 <strong><code>실제 데이터가 저장된 주소를 참조</code></strong>하기에 참조(reference) 타입이라고 불리는 것이다. </p>
<hr> 


<h3 id="원시타입-새로운-메모리-공간-사용">원시타입 (새로운 메모리 공간 사용)</h3>
<p>자바스크립트에서 원시 타입 (string, number, bigint, boolean, undefined, ES6 부터 추가된 symbol) 은 변수에 할당될 때, 메모리의 고정 크기로 원시 값을 저장하고 해당 저장된 값을 변수가 직접적으로 가리키는 형태를 띈다. 불변성을 가진다. </p>
<pre><code class="language-js">let a = 100;
a = 50;</code></pre>
<p><code>a란 변수에 100이란 값을 할당</code>하고, 2번째 라인에서 <code>50으로 재할당</code>을 해준 예시이다. </p>
<ol>
<li><p>첫 라인이 실행되면 메모리에 Number타입의 100이란 값이 생성되고, 식별자 a는 메모리에 생성된 100의 메모리 주소를 가리킨다. (a -&gt; 100 메모리 주소)</p>
</li>
<li><p>두번째 라인이 실행되면, 메모리에 생성된 100이란 값이 50으로 수정되는것이 아니다. 새로운 Number타입의 50이란 값을 <code>새로운 메모리에 생성</code>하고 a가 가리키던 메모리가 바뀌는것이다. (a -&gt; 50의 새로운 메모리 주소)</p>
</li>
</ol>
<p>쉽게 말하면, 땅부자들이 땅을 막 사드려도 문제 없는 듯 행동한다. 값이 바뀌면 그냥 새로운 빌딩을 사들여서, 새로운 빌딩에 물건을 넣어두면 된다. 
이전 빌딩들은 어찌 못하고, 그대로 가지고 있는다. (불변성)</p>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/28614f1d-272a-4c03-ab83-419279fed3f9/image.png" alt=""></p>
<blockquote>
<p>*<em>원시타입은 (Primitive Type) *</em>새로운 빌딩 공간을 확보한다. 그러면, 원시 타입의 값이 복사 될때는 어떻게 될까? </p>
</blockquote>
<pre><code class="language-js">let a = 100;
let b = a;
a = 50;

console.log(b) // 100</code></pre>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/b1f75d16-e1f1-41f1-94a6-31f96d560f63/image.png" alt=""></p>
<p>땅부자들은 원시타입 값이 재할당 될 때마다, 새로운 빌딩(메모리 공간)을 확보하기 때문에, 개의치 않는다. </p>
<p>새로운 변수 b에 a를 할당 하게되면, 변수 b의 공간에는 a의 값을 값을 통째로 복사하여 변수의 메모리에 담게 된다. 그렇기에 변수 a가 50으로 재할당 되더라도 b는 전혀 영향을 받지 않는다. </p>
<hr> 

<h3 id="원시타입새로운-메모리-공간-vs-참조타입-정리-메모리-주소-참조">원시타입(새로운 메모리 공간) vs 참조타입 정리 (메모리 주소 참조)</h3>
<p>_<strong>원시타입(Primitive type)</strong>_의 
변수들은 데이터 복사가 일어날 때, <strong>메모리 공간을 새로 확보하여 독립적인 값</strong>을 저장한다.</p>
<ul>
<li>땅부자들이 1인 빌딩을 새로 지으며 공간을 확보함.</li>
<li>불변성을 가지고 있음. 낙장불입. </li>
<li>불변성을 갖고있기 때문에, 재할당 시 기존 값이 변하는것 처럼 보일지 몰라도 사실 새로운 메모리에 재할당한 값이 저장됨. 변수가 가리키는 메모리가 달라졌을 뿐임. </li>
<li>엄청난 땅부자라도... 무한한 빌딩들을 계속 지으면... 언젠간.. 자리가 없거나 무슨일이 생기겠지? 그러니 메모리를 고려하자.</li>
</ul>
<p><em><strong>Simple Korean -&gt; 땅부자들 새로운 공간 확보해서, 변수들이 새로운 빌딩에(메모리) 접근함.</strong></em></p>
<p><em><strong>참조 타입(Reference type)은</strong> 
_메모리에 직접 접근이 아닌, _<strong>메모리의 주소</strong>에 대한 간접적인 참조를 통해 메모리에 접근하는 데이터 타입이다</em>.</p>
<p><strong>Simple Korean -&gt; 아파트 새대 주소를 정확히 알아야지 택배 전달이 가능함. 사람이 너무 많음. 사람이 많기 때문에 주소를 이용(참조)함.</strong></p>
<hr> 

<p>Reference: </p>
<ul>
<li><a href="https://spoit.tistory.com/30">https://spoit.tistory.com/30</a></li>
<li><a href="https://velog.io/@younoah/call-by-value-call-by-reference">https://velog.io/@younoah/call-by-value-call-by-reference</a></li>
<li><a href="https://www.geeksforgeeks.org/call-by-value-vs-call-by-reference-in-javascript/">https://www.geeksforgeeks.org/call-by-value-vs-call-by-reference-in-javascript/</a></li>
<li><a href="https://velog.io/@nomadhash/Java-Script-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC%EC%99%80-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%AC">https://velog.io/@nomadhash/Java-Script-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC%EC%99%80-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%AC</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP , 비연결성, Stateless, Stateful]]></title>
            <link>https://velog.io/@frank_kim/HTTP-%EB%B9%84%EC%97%B0%EA%B2%B0%EC%84%B1-Stateless-Stateful</link>
            <guid>https://velog.io/@frank_kim/HTTP-%EB%B9%84%EC%97%B0%EA%B2%B0%EC%84%B1-Stateless-Stateful</guid>
            <pubDate>Sun, 05 Feb 2023 12:13:34 GMT</pubDate>
            <description><![CDATA[<p>HTTP가 무엇인지, HTTP의 특징을 더 자세히 학습하고자 글로 정리한다.
목표: Connectionless(비연결성)가 무엇인지, stateless vs stateful 차이점을 simple Korean으로 설명하기.</p>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/a2b07cb3-cf77-4fad-aa5b-b95273ed8c6a/image.png" alt=""></p>
<h2 id="🌐-http란-그리고-특징들">🌐 HTTP란? 그리고 특징들</h2>
<p>HTTP는 <strong>H</strong>yper <strong>T</strong>ext <strong>T</strong>ransfer <strong>P</strong>rotocol의 약자다.</p>
<p>인터넷에서 데이터를 주고 받을 수 있는 프로토콜이다. 즉 인터넷에서 데이터를 받을 때 <strong>규칙(약속)</strong>이라는 것. 모든 프로그램이 <strong>이 규칙</strong>에 맞춰 개발해서 서로 정보를 교환할 수 있게 된다.</p>
<p>HTTP는 상태를 가지고 있지 않는 <code>Stateless 프로토콜</code>이며 Method, Path, Version, Headers, Body 등으로 구성된다.</p>
<hr> 

<h3 id="connectionless비연결성">Connectionless(비연결성)</h3>
<p><code>Connectionless(비연결성): 클라이언트와 서버가 연결되어 있지 않다는 것.</code></p>
<ol>
<li>그러면 연결되어 있지 않다면서... 어떻게 통신을 한다는거지?</li>
</ol>
<ul>
<li>클라이언트가 어떠한 데이터를 요청하면 서버는 응답을 하고 <em><strong>한번 맺었던 연결을 끊어버린다.</strong></em></li>
</ul>
<ol start="2">
<li>클라이언트와 서버가 연결되어 있지 않은 이유는 무엇일까?</li>
</ol>
<ul>
<li><p>**Why? -&gt; 계속해서 리소스가 들어가기 때문이다. 리소스를 아낄 수 있기 때문에 더 많은 연결을 할 수 있는 장점이 있다. 그래서 서버는 연결을 끊어버린다.</p>
</li>
<li><p>*</p>
<p>이러한 특징 때문에 매번 어떠한 요청에 대해, 새로운 연결을 해야 하므로 &quot;오버헤드&quot;가 발생한다는 단점도 있다.</p>
</li>
</ul>
<p><em>오버헤드(overhead): 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말한다.</em></p>
<hr> 

<h3 id="stateless상태없음">Stateless(상태없음)</h3>
<p><code>Stateful(상태유지): 상태를 가지고 있다는 의미. 즉, 서버가 클라이언트의 상태를 보존함. 상태를 기억함.</code></p>
<blockquote>
<p>예를 들어서, Pub에 직원이 여러명이 있다고 가정하자.</p>
</blockquote>
<p>Staff A: 필요하신거 있으실까요?
프랭크: 발렌타인 17년산 주세요.</p>
<blockquote>
</blockquote>
<p>Staff B: 필요하신거 있으실까요?
프랭크: 5분전에 시킨거 취소하고, 30년산으로 바꿔주세요. (기억하고 있음)</p>
<blockquote>
</blockquote>
<p>Staff C: 필요하신거 있으실까요?
프랭크: 10분전에 시킨거 취소할게요. 맥주 한잔 주세요. (기억하고 있음)</p>
<blockquote>
</blockquote>
<p>*<em>(이렇게 상태를 기억하는 방식을 Stateful이라고 한다.)
*</em></p>
<blockquote>
<p><strong>포스기를 사용하는 것처럼 정보 트래킹(Tracking) 가능하다.</strong></p>
</blockquote>
<ul>
<li><strong>이렇게 되면 직원들은 어떤 직원이 어떤 주문을 받았는지 모두 찾아다녀야 할 것이고, 
이것은 비용이 많이 들게 된다.</strong></li>
</ul>
<h3 id="stateful상태유지">Stateful(상태유지)</h3>
<p><code>Stateless(상태없음): 상태를 가지고 있지 않는다는 의미이다. 좀 더 구체적으로 설명하면 서버가 클라이언트의 상태를 가지고 있지 않는 것이다.</code></p>
<blockquote>
</blockquote>
<p>Staff A: 필요하신거 있으실까요?
프랭크: 발렌타인 17년산 주세요.</p>
<blockquote>
</blockquote>
<p>Staff B: 필요하신거 있으실까요?
프랭크: 5분전에 A한테 발렌타인 17년산 시켰는데, 30년산으로 바꿔주세요.</p>
<blockquote>
</blockquote>
<p>Staff C: 필요하신거 있으실까요?
프랭크: 10분전에 A한테 발렌타인 17년산 시켰는데, 5분전에 30년산으로 바꿨어요. 그냥 취소하고 맥주 한잔 주세요.</p>
<ul>
<li><strong>상태를 저장하지 않는다면 요청을 할 때, 모든 정보를 준다.</strong></li>
<li><strong>이런 식으로 요청을 할 때 모든 정보를 담아서 요청하기 때문에, 직원들은 쉽게 주문을 파악할 수 있고, 비용을 최소화 할 수 있다</strong>.</li>
</ul>
<hr> 

<h2 id="🌐-stateless-vs-stateful">🌐 Stateless vs Stateful</h2>
<h3 id="stateless-상태없음-장단점">Stateless (상태없음) 장단점</h3>
<ul>
<li><p>&quot;비용(리소스)&quot;를 줄인다.</p>
</li>
<li><p>Stateless 방식은 요청을 할 때, 모든 정보를 각 서버에게 전달해야 하기 때문에 요청이 복잡해질 수 있는 단점이 있다.</p>
</li>
<li><p>반면에, 요청을 한번에 주기 때문에 많은 서버를 둬도 큰 부담이 안된다는 장점이 있다.</p>
</li>
<li><p>대량의 트래픽 발생 시에도 서버 확장을 통해 대처를 수월하게 할 수 있다는 장점도 있다. (stateful과 달리 서버가 바뀌어서도 정확한 응답에 문제가 없으니까). Stateless는 서버의 확장성에 용이하다.</p>
</li>
<li><p>이벤트 소개 페이지처럼 아무 정보를 담을 필요가 없는 페이지는 상태없음으로 만들면 좋다.</p>
</li>
<li><p>하지만 로그인처럼 유저가 로그인하고 있다는 상태를 유지해야 하는 서비스는 상태를 유지하지 않으면 로그인이 풀려버린다.</p>
</li>
<li><p>따라서 모든 것을 상태없음으로 설계할 수 없다. 어쩔 수 없는 경우에만 상태 유지를 최소한으로 사용하는 것이 베스트이다. </p>
</li>
</ul>
<h3 id="stateful-상태유지-장단점">Stateful (상태유지) 장단점</h3>
<ul>
<li><p>클라이언트와 서버 간에 송수신을 하며 단계별 과정을 진행하는데 있어, 서버에서 클라이언트가 이전 단계에서 제공한 값을 저장하고 다음 단계에서도 저장한 상태이다.</p>
</li>
<li><p>대표적으로 홈페이지에서 한번 로그인을 하면 페이지를 이동해도 로그인이 풀리지않고 계속 유지되는 것이 바로 서버가 클라이언트의 상태를 유지(기억)하고 있으니까 가능한 것이다.</p>
</li>
<li><p>클라이언트의 정보를 기억한다라는 말은 어딘가에 정보를 저장하고 통신할때마다 읽는다는 뜻이다.</p>
</li>
<li><p>이러한 정보들은 일반적으로 브라우저의 쿠키(Cookie)에 저장되거나, 서버의 세션(Session) 메모리에 저장되어 상태를 유지하게 된다.</p>
</li>
<li><p>stateful의 문제점은 해당 서버가 멈추거나 여러 이유로 해당 서버가 못쓰게 되어 다른 서버를 사용해야 할때 발생한다. 왜냐하면 새로운 서버에서는 이전 서버에서 가지고 있던 상태값들을 가지고 있지 않기 때문이다.</p>
</li>
<li><p>클라이언트 상태들을 들고 있으니 용량 한계가 존재한다.</p>
<hr> 

</li>
</ul>
<h2 id="🌐-stateless-또-다른-특징들">🌐 Stateless 또 다른 특징들</h2>
<h3 id="stateless-와-http--rest">Stateless 와 HTTP / REST</h3>
<p>반면 REST는 프로토콜이라기 보단 구조(Architecture)에 가깝다.
즉, REST는 HTTP 프로토콜 상에 구현된 Resource Oriented Architecture (ROA) 설계 구조다.
따라서, HTTP와 REST 모두 Stateless한 성격을 가진다.</p>
<blockquote>
<p>HTTP는 Statelss한 성격을 가진 &#39;프로토콜&#39;
REST는 Stateless한 성격을 가진 &#39;설계 구조&#39;</p>
</blockquote>
<hr> 

<h3 id="stateless-와-토큰token">Stateless 와 토큰(Token)</h3>
<p>Stateless(상태없음) 특징으로, 클라이언트와 서버간의 통신에 필요한 모든 상태 정보들은 클라이언트에서 가지고 있다가 서버와 통신할때 데이터를 실어 보내는 것이다.</p>
<p>그래서 서버는 단순히 받아서 응답만 해주기 때문에 서버에 대한 부하가 현저히 줄어든다.</p>
<p>하지만 로그인 유지와 같은 상태는 싫으나 좋으나 stateful한 상태를 사용하여야 하는데, 그러면 서버에 부하가 생기고 좀 그렇다.</p>
<p><strong>그래서 stateless 특징을 유지하면서도 로그인 상태 유지를 가능하게 하는 기술이 바로 JWT 토큰이다.</strong></p>
<p><strong>토큰은</strong> 클라이언트가 암호화된 로그인 정보들을 지니고 있다가 서버에 통신할때 넘겨줌으로써 내가 로그인 됐음을 인증하는 방식이다.</p>
<p>따라서 특별한 일이 없다면, Stateless - 무상태(상태없음)를 지향해야하며 정말 필요한 경우에만 상태 유지를 해야한다.</p>
<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://mangkyu.tistory.com/98">https://mangkyu.tistory.com/98</a></li>
<li><a href="https://fomaios.tistory.com/entry/Network-HTTP%EC%9D%98-%ED%8A%B9%EC%A7%95%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0feat-%EB%B9%84%EC%97%B0%EA%B2%B0%EC%84%B1-%EB%AC%B4%EC%83%81%ED%83%9C">https://fomaios.tistory.com/entry/Network-HTTP%EC%9D%98-%ED%8A%B9%EC%A7%95%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0feat-%EB%B9%84%EC%97%B0%EA%B2%B0%EC%84%B1-%EB%AC%B4%EC%83%81%ED%83%9C</a></li>
<li><a href="https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Stateful-Stateless-%EC%A0%95%EB%A6%AC">https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Stateful-Stateless-%EC%A0%95%EB%A6%AC</a></li>
<li><a href="https://stackoverflow.com/questions/56671582/whats-the-difference-between-stateless-and-connection-less">https://stackoverflow.com/questions/56671582/whats-the-difference-between-stateless-and-connection-less</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 프로토타입 prototype? hasOwnProperty?  Class? ]]></title>
            <link>https://velog.io/@frank_kim/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-prototype-Class</link>
            <guid>https://velog.io/@frank_kim/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-prototype-Class</guid>
            <pubDate>Thu, 26 Jan 2023 16:40:54 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트는 10일만에 만들어진 프로토타입 기반 객체지향 프로그래밍 언어다. 자바스크립트에서 프로토타입이 얼마나 강력한지 알기 위해 프로토타입 개념을 더 자세히 학습하고자 한다. 감사하게도 정리가 잘 되어 있는 온라인 소스가 많아서 부분부분 참고하며 글로 풀어보려고 한다. 
<strong>목표: 나 자신도 프로토타입 개념에 자신감을 가지고, 이 글을 보는 모든 사람이 이해할 수 있도록 simple Korean으로 풀어 설명하는 것이다.</strong></p>
<h2 id="객체지향이란-관계조직에-초점">객체지향이란? (관계/조직에 초점)</h2>
<p>그러면 객체지향 프로그래밍 언어란 뭘까? 객체지향 절차지향 등 어려운 용어가 상당히 많다. Simple Korean으로 풀어보면...</p>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/fb14c616-1b13-4754-a12f-0bf524a950a1/image.png" alt=""></p>
<ul>
<li><code>우리가 실생활에서 쓰는 모든 것, 상태와 행위를 객체라 한다. 이 객체들을 레고 블럭처럼 조립</code>해서 <code>하나의 프로그램을 만드는 것</code>을 객체 지향 프로그래밍이라고 할 수 있다. </li>
</ul>
<blockquote>
<p><strong>객체지향을 들으면서, 절자 지향 프로그래밍도 들어봤는데 차이점이 뭐지?</strong>
###
<strong>절차지향은 <code>순차적으로 실행</code>에 초점이 되어있고 **
**객체지향은 <code>관계/조직에</code> 초점을 맞추고 있다는 초점의 차이일 뿐이다.</strong>
절차적 프로그래밍이라고 해서 객체를 다루지 않는 것이 아니고, 객체지향 프로그래밍이라고해서 절차가 없는 것도 아니다.</p>
</blockquote>
<h2 id="프로토타입이란-prototype">프로토타입이란 (prototype)?</h2>
<p>프로토타입 정의를 알아보기 전에, 그나마? 친근한 용어를 이용해 특징을 알아보는 것도 좋을 것 같다.</p>
<ul>
<li><p>자바스크립트에서 <strong>단순 원시 타입</strong>(simple primitive)인 문자열, 숫자, 불리언, null, undefined를 <strong>제외한 <code>모든 타입은 객체다. 그렇다. 자바스크립트에서는 배열, 객체, 함수도 객체다</code>.</strong></p>
</li>
<li><p>JavaScript의 모든 객체(배열, 객체, 함수 등)는 <strong>상위 객체를 참조</strong>하며, <strong><code>이 상위 객체를 프로토타입</code></strong>이라고 한다. 일단 상위 객체를 참조한다는 말만 기억해두자.</p>
</li>
</ul>
<h3 id="프로토타입-prototype-정의">프로토타입 Prototype 정의</h3>
<blockquote>
<p> <strong>위키디피아 정의 - 프로토타입 기반 언어는 클래스 기반 언어에서 상속을 사용하는 것과는 다르게, 객체를 원형(프로토타입)으로 하는 복제 과정을 통해 객체의 동작 방식을 재사용 할 수 있게 한다.</strong></p>
</blockquote>
<p>프로토타입 기반 언어는 원형(원본) 객체를 복제하여 새로운 객체를 하는 생성하는 언어를 말한다. 그런데 자바스크립트도 복제를 할까? 자바스크립트는 약간 다르다. 복제가 아닌 <strong><code>프로토타입 링크를 통해</code></strong> <strong>원형(원본)을 참조한다</strong>.</p>
<ul>
<li><strong>프로토타입 링크를 통해 -&gt; 원형을 참조한다</strong>를 꼭!!!!!!!! 기억하자.</li>
<li><strong>결국 객체지향 언어다. 이는, 관계와 조직에 초점을 둔다는 점도 기억하자.</strong></li>
</ul>
<blockquote>
</blockquote>
<p>적절한 비유일지는 모르겠지만...... 내가 이해한 프로토타입은 리액트와 어렴풋이 비슷하다.</p>
<ol>
<li>리액트로 생각해보면, 부모와 자식사이에서 props나 함수를 <strong>공유한다.</strong></li>
</ol>
<p>*<em>-----&gt; <code>프로토타입</code>도 부모 자식 사이의 공유와 비슷하다. *</em></p>
<ol start="2">
<li>리액트에서도 <strong>부모 컴포넌트가 최상위</strong>고, 자식 컴포넌트들은 부모가 던져준 props나 함수를 사용할 수 있다. </li>
</ol>
<p>-----&gt;<strong><code>자식은 부모가 공유해주는 prototype 함수</code>를 사용할 수 있다.</strong></p>
<ol start="3">
<li>props drilling와 비슷하게 props를 위 아래로 넘겨줄 수 있는 체인 매커니즘을</li>
</ol>
<p>*<em>-----&gt; <code>프로토타입 체인</code>이라고 부른다. *</em></p>
<ol start="4">
<li>리액트에서 map을 사용할 때 key 값이 필요하듯, 부모와 자식의 연결고리 key를</li>
</ol>
<p><strong>-----&gt; <code>_proto_</code> 라고 부른다. <code>_proto_</code>를 이용하여 상위를 참조한다.</strong></p>
<h3 id="예제-1">예제 1</h3>
<ul>
<li>위에서 언급한 부모와 자식 사이의 공유를 염두해두자.</li>
</ul>
<pre><code class="language-js">let arr = [1,2,3];
let add = function(x,y){
    return x + y; 
}

console.dir(add.prototype.constructor); // ƒ add(x,y)
console.log(add.prototype.constructor === add); // true
</code></pre>
<p>(위에 코드 &amp; 아래 사진 참조)</p>
<p>add 함수를 만들면, 자동으로 add.prototype.constructor가 생긴다. 신기한 부분은 <code>add === add.prototype.constructor</code> 이곳이다. 
코드를 console.dir로 까보면 <code>prototype 프로퍼티와</code> <code>_proto_</code> 용어가 나온다. </p>
<p>즉, add 함수를 생성할 때, (아래 사진 참조)</p>
<ol>
<li>add 함수는 <code>prototype 프로퍼티</code>와 <code>_proto_</code> 를 가지고 있다.</li>
<li>자동으로 <strong>add prototype</strong>이 따로 생성 된다. <strong>이 prototype 안에는 constructor가 있다.</strong></li>
<li><code>add 함수에 prototype 프로퍼티는</code> -&gt; <code>따로 생긴 add.prototype을 가르킨다.</code></li>
<li>add 함수 === add.prototype.constructor 연결이 된다.</li>
</ol>
<ul>
<li>여기서 헷갈릴 수 있는데, <code>함수가 가지고 있는 prototype 프로퍼티</code>와, <code>따로 생긴 prototype은 다르다.</code></li>
</ul>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/e055c4c5-a0c6-48ff-90d9-d4845adec9be/image.png" alt=""></p>
<pre><code class="language-js">add.setLastName = function(){
    return &#39;Last: Kim&#39;;
}

add.prototype.setName = function(){
    return &#39;Name: Frank&#39;;
}

console.log(add.setLastName());
console.log(add.prototype.setName());</code></pre>
<ul>
<li>그러면!!! 우리는 자식과의 공유를 원한다. 만약 내가 add 함수에 다른 함수를 추가하고 싶다면? </li>
<li>prototype에 추가하는 것과 일반 함수에 추가하는 것의 차이점이 뭘까?</li>
<li>어떻게 사용하면 다른 환경에서 공유를 할 수 있을까?</li>
</ul>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/dd707b5f-4234-473f-ae37-ccaeb7de4b9c/image.png" alt=""></p>
<h3 id="일반-메소드-vs-prototype">일반 메소드 vs Prototype</h3>
<ol>
<li>prototype에 추가하는 것과 일반 함수에 추가하는 것의 차이점이 뭘까? </li>
<li>어떻게 사용하면 다른 환경에서 공유를 할 수 있을까? </li>
</ol>
<p><strong>ES5 이전에는 프로토타입 체인을 구현하려면 무조건 생성자 함수와 new 연산자를 사용해야 했다. 다행스럽게도 ES5부터는 Object.create라는 프로토타입 언어의 특징을 잘 살려 객체를 생성할 수 있는 새로운 방법을 제공한다. 함수면 체인 구현이 가능해보인다.</strong></p>
<ul>
<li>프로토타입에 메소드를 추가하면 해당 생성자로 생성된 모든 객체에서 사용 가능하다.</li>
</ul>
<p><code>우리는 새로운 방법 Object.create를 사용해볼 것이다.</code> </p>
<pre><code class="language-js">// ========= 프로토타입 체인 구현 =========
let copyCat1 = Object.create(add);

console.log(copyCat1); // Function {}

console.log(copyCat1.setLastName()); 
// &#39;Last: Kim&#39;

console.log(copyCat1.prototype.setName()); 
// &#39;Name: Frank&#39;
</code></pre>
<p>위와 같이 copyCat1은 setLastName, setName 함수를 따로 설정해주지 않아도 됐다. prototype의 특성 프로토타입 체인(체인 메커니즘)을 통해 상위를 참조해서 함수가 사용 가능해졌다.</p>
<p>프로토타입 기반이라는 의미는 위에서 언급한 것처럼, <strong>상위 객체를 참조</strong>하며, <strong>이 상위 객체를 프로토타입</strong>이라고 한다.</p>
<h3 id="prototype-응용">Prototype 응용</h3>
<p>만약 99999999999개의 값을 바꾸라고...누군가..지시한다면...?</p>
<pre><code class="language-js">let PROTOTYPE = {
    type: &#39;employee&#39;,
    work: function() {},
}

function Company(name, position){
  let who = {
     name:name,     
     position: position,
  }

    who._proto_ = PROTOTYPE;

    return who;
}

var name1 = Company(&#39;kim&#39;, &#39;developer&#39;);
var name2 = Company(&#39;lee&#39;, &#39;designer&#39;);
// ..... x99999999997개......</code></pre>
<p>앞서 말한바와 같이 <code>_proto_</code>는 key값 연결고리다. 저 연결고리 키값을 바꿔버리면... 값들이 한번에 바뀌는 현상을 볼 수 있다.</p>
<pre><code class="language-js">PROTOTYPE.type = &#39;Team&#39;
console.log(name1._proto_.type); // &#39;Team&#39;

name1._proto_.sleep = () =&gt; &#39;go to sleep&#39;;

console.log(PROTOTYPE); 
// {type: &#39;Team&#39;, work: ƒ, sleep: ƒ}


console.log(name2._proto_); 
// {type: &#39;Team&#39;, work: ƒ, sleep: ƒ}</code></pre>
<h3 id="프로토타입-prototype-특징-정리">프로토타입 Prototype 특징 정리</h3>
<ul>
<li>JavaScript의 모든 객체의 프로토타입은 값을 할당하는 시점에 결정되며, 프로토타입은 변경될 수 있다.</li>
<li>JavaScript는 배열, 문자열 심지어 함수도 객체로 간주한다.</li>
<li>프로토타입은 상위 객체를 의미한다.</li>
<li>직접 생성한 프로토타입은 새로운 프로퍼티나 메소드를 마음껏 추가하거나 삭제할 수 있다.</li>
<li>물론 자바스크립트 표준 객체의 프로토타입도 임의로 수정할 수 있으나, 심각한 오류가 발생할 가능성이 있다. 따라서 자바스크립트 표준 객체의 프로토타입은 수정해서는 안된다.</li>
<li>객체는 함수를 사용해서 만들어지고, 객체는 함수의 프로토타입 객체를 복제하여 생성된다.</li>
<li>모든 객체는 자신이 어떤 원본 객체를 복제하여 생성된 것인지에 대한 정보를 가지고 있다.</li>
<li>프로토타입에 메소드를 추가하면 해당 생성자로 생성된 모든 객체에서 사용 가능하다.</li>
<li><strong>객체를 생성하면 생성한 만큼 함수가 등록된다. 그리고 함수를 여러 개 등록하면 메모리 공간을 많이 차지해 메모리 낭비가 된다. 프로토타입을 사용함으로 메모리 낭비를 줄일 수 있다.</strong></li>
</ul>
<h3 id="hasownproperty-vs-prototype">hasOwnProperty vs Prototype</h3>
<p>이 메소드는 객체가 특정 프로퍼티를 <strong>자기만의 직접적인 프로퍼티로서 소유</strong>하고 있는지를 판단하는데 사용된다. in 연산과는 다르게, 이 메소드는 <strong>객체의 프로토타입 체인을 확인하지는 않는다.</strong></p>
<ul>
<li>해당 객체에 특정 프로퍼티가 존재하면 true, 그렇지 않으면 false 를 반환한다.</li>
<li>프로토타입 체인 따위는 신경쓰지 않는 돌직구 녀석.</li>
</ul>
<pre><code class="language-js">const obj = {
    ownProperty: 1
};
obj.hasOwnProperty(&quot;ownProperty&quot;); // true
obj.hasOwnProperty(&quot;prototype&quot;); // false

obj.newProperty = 1;
Object.prototype.fromProtoType = &#39;hey prototype&#39;;

console.log(obj.hasOwnProperty(&quot;newProperty&quot;)); // true
console.log(obj.hasOwnProperty(&quot;fromProtoType&quot;)); // false

console.log(obj); // {ownProperty: 1, newProperty: 1}
console.log(obj._proto_.fromProtoType); // &#39;hey prototype&#39;;</code></pre>
<p>여기서 주의할 점!!! 자바스크립트는 프로퍼티 명칭으로서 hasOwnProperty()를 보호하지 않는다. <strong>hasOwnProperty 네이밍으로 장난치지 말라는 소리...</strong></p>
<pre><code class="language-js">const messWithHasOwnProPerty = {
  hasOwnProperty: function() {
    return false;
  },
  careful: &#39;Be careful&#39;
};

console.log(messWithHasOwnProPerty.hasOwnProperty(&#39;careful&#39;)); 
// false</code></pre>
<p>그렇다면... 우리는 hasOwnProperty를 언제 사용하면 좋을까? 
prototype과 어떻게 다르게 써야할까? 
왜 사용해야할까? </p>
<p>시간이 지나 코드를 변경해야할 수도 있고, 누군가 자신의 코드를 재사용할 수 도 있다. 하나의 예로 hasOwnProperty 를 사용하지 않은 채, 시간이 흘러 누군가 코드를 수정했다고 가정해보자. </p>
<pre><code class="language-js">const emptyObj = {};

console.log(emptyObj.getFirstName()); // &#39;Kim&#39;;
console.log(emptyObj.hasOwnProperty(getFirstName())); // false;

const who = {
  name: &#39;Frank&#39;,
  getName() {
    return this.name; 
  }
};

console.log(who.name); // &#39;Frank&#39;
console.log(who.getName()); // &#39;Frank&#39;

Object.prototype.getFirstName = function(){
    return &#39;Kim&#39;;
}


// Bad - 프로토타입 체인을 통해 Object 접근
if(who.getName){
    console.log(who.getName()); // &#39;Frank&#39;
}

// Bad - 프로토타입 체인을 통해 Object 접근
if(who.getFirstName){
    console.log(who.getFirstName()); // &#39;Kim&#39;
}

// Good - 고유의 프로퍼티인지 체크. 프로토타입 한번 거름.
if(who.hasOwnProperty(&quot;getName&quot;)){ 
    console.log(who.getName()); // &#39;Frank&#39;
}

// Good - 고유의 프로퍼티인지 체크. 프로토타입 한번 거름.
if(who.hasOwnProperty(&quot;getFirstName&quot;)){
    console.log(&#39;Is it unique enough?&#39;); 
} else {
    console.log(&quot;Doesn&#39;t have getFirstName() as property&quot;);
  // &quot;Doesn&#39;t have getFirstName() as property&quot;
}

</code></pre>
<blockquote>
<ul>
<li>hasOwnPropety로 우리가 기대할 수 있는것은? <ol>
<li>예기치 못한 상황에 따른 버그 대비 </li>
<li>코드의 가독성 향상</li>
</ol>
</li>
</ul>
</blockquote>
<p>흠... 우리가 잘 알고 있는 오브젝트를 루핑할 때 쓰는 for in. 
과연 for in은 프로토타입 체인으로부터 안전할까? </p>
<pre><code class="language-js">const emptyObjAgain = {};

for(let key in emptyObjAgain){
    console.log(key); // undefined
}

Object.prototype.loopEmptyObj = function(){
    return &#39;accessing prototype!&#39;
}

for(let key in emptyObjAgain){
    console.log(key); // loopEmptyObj
}

// ========== 방어로직을 세워볼까? ==========
for(let key in emptyObjAgain){
    if(emptyObjAgain.hasOwnProperty(key)){
        console.log(key); 
    } else {
        console.log(&#39;Accesing prototype&#39;); 
    }
}</code></pre>
<p>역시 자바스크립트는 유연한 언어다... ㅎㅎㅎ 조심 또 조심...</p>
<p>오호.. hasOwnProperty()와 비슷한 친구를 찾았다. </p>
<blockquote>
<p>Object.hasOwn() Note: 
*<em>Object.hasOwn() *</em>is intended as a replacement for Object.prototype.hasOwnProperty().
쓰임새: Object.hasOwn(obj, prop)</p>
</blockquote>
<pre><code class="language-js">const friends = {
    friend1: &#39;kim&#39;,
      friend2: &#39;lee&#39;,
};

Object.prototype.makeNewFriends = function(){
    return `accessing prototype!`
}

for (const key in friends) {
  if (Object.hasOwn(friends, key)) {
    console.log(key); // &#39;friend1&#39;, &#39;friend2&#39; 
  }else {
    console.log(key); // makeNewFriends
  }
}</code></pre>
<h3 id="클래스-vs-prototype">클래스 vs Prototype</h3>
<p>정확성, 안전성, 예측성의 관점에서 클래스는 대체로 타입과 비슷하므로 동적으로 프로퍼티를 변경할 수 있는 프로토타입에 비해 더 신뢰성 높은 코드를 작성할 수 있다고 하는 게 주요 의견이다.</p>
<p>&quot;글이 길어진 관계로... 다음 챕터에서...&quot; </p>
<h3 id="마무리">마무리</h3>
<p>재밌어서 시간 가는줄 모르고 학습했다. 배워도 끝이 없다...ㅋㅋㅋㅋ 아직 프로토타입과 클래스 차이점을 두고, 자바스크립트에서 어떻게 상속을 하는 것이 효율적인지 판단이 서지를 않는다. </p>
<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://jongminfire.dev/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80">https://jongminfire.dev/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80</a></li>
<li><a href="http://www.tcpschool.com/javascript/js_object_prototype#:~:text=%ED%95%98%EC%A7%80%EB%A7%8C%20C%23%EC%9D%B4%EB%82%98%20C%2B%2B,%EC%96%B8%EC%96%B4%EC%99%80%EB%8A%94%20%EC%95%BD%EA%B0%84%20%EB%8B%A4%EB%A6%85%EB%8B%88%EB%8B%A4">http://www.tcpschool.com/javascript/js_object_prototype#:~:text=%ED%95%98%EC%A7%80%EB%A7%8C%20C%23%EC%9D%B4%EB%82%98%20C%2B%2B,%EC%96%B8%EC%96%B4%EC%99%80%EB%8A%94%20%EC%95%BD%EA%B0%84%20%EB%8B%A4%EB%A6%85%EB%8B%88%EB%8B%A4</a>.</li>
<li><a href="https://www.youtube.com/watch?v=zbgKZVMzdfk">https://www.youtube.com/watch?v=zbgKZVMzdfk</a></li>
<li><a href="https://pulpul8282.tistory.com/98">https://pulpul8282.tistory.com/98</a></li>
<li><a href="https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object_prototypes">https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object_prototypes</a></li>
<li><a href="https://ui.toast.com/weekly-pick/ko_20160603">https://ui.toast.com/weekly-pick/ko_20160603</a></li>
<li><a href="https://tecoble.techcourse.co.kr/post/2021-06-14-prototype/">https://tecoble.techcourse.co.kr/post/2021-06-14-prototype/</a></li>
<li><a href="https://ko.javascript.info/prototype-inheritance">https://ko.javascript.info/prototype-inheritance</a></li>
<li><a href="https://mygumi.tistory.com/330">https://mygumi.tistory.com/330</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발자를 하는 이유  Why? ]]></title>
            <link>https://velog.io/@frank_kim/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-Why</link>
            <guid>https://velog.io/@frank_kim/%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-Why</guid>
            <pubDate>Wed, 25 Jan 2023 14:53:13 GMT</pubDate>
            <description><![CDATA[<h2 id="개발자프랭크--">개발자프랭크 : [</h2>
<blockquote>
<p>TL;DR: 개발자 성장기. 지금도 성장하고 있다.</p>
</blockquote>
<h3 id="q-많은-이들이-묻는다-왜-갑자기-개발자를-하고-싶으세요-">{Q: 많은 이들이 묻는다. &#39;왜 갑자기 개발자를 하고 싶으세요?&#39;} ,</h3>
<p>사람들의 질문은 타당했다. 나(프랭크)는 비전공자고, 남들이 쉽게 가지 않는 길을 걸어왔다. 나는 다양한 경험과 <strong>자기 성장</strong>에 집착한다. 좋게 말하면 자기성장이고, 현실적으로 말하면 무모한 도전으로 인한 성장이다. 자기성장(무모한 도전) 때문에 개발 공부를 시작했었음을 먼저 알리고 싶다.</p>
<ul>
<li>대학교 1학년 겨울방학 3개월 동안, 필리핀 마닐라로 넘어가서 어학원 매니저로 일하며 수업 스케쥴 관리와 학생 관리를 했다.</li>
<li>군대에서 미국 J1 비자 무역회사 1년 인턴쉽을 준비했다.</li>
<li>미국 출국하기 전까지, 동두천 미군 부대 내부 외식업에서 매니저를 했다.</li>
<li>미래에셋 영업사관학교 수료.</li>
<li>미국 마케팅협회 Professional Certified Marketer 자격증 취득.</li>
<li>한국 문화 및 서비스를 글로벌하게 알리는 것을 즐겼고, 마케팅 업무 및 50개국 이상의 국가  VIP들 의전을 경험했다.</li>
<li>캐나다에서 북미 담당 Apple IT Support 일을 했다.</li>
<li>캐나다 영주권 취득.</li>
</ul>
<p><strong><em>위와 같은 다양한 경험에도 여전히 자기성장 갈증은  채워지지 않았다.</em></strong></p>
<h3 id="a-0-가치관-">{A-0: &#39;가치관&#39;} ,</h3>
<blockquote>
</blockquote>
<p>무모한 도전의 동력은 무엇일까도 생각해 봤다. <code>나의 가치관이었다.</code> </p>
<ul>
<li>새로운 도전을 해결하며 성장 추구. </li>
<li>누군가에게 도움을 줄 수 있는 선한 영향력 전파. </li>
<li>숲 전체를 보는 걸 좋아한다. </li>
<li>가능성을 믿고 중시한다. </li>
</ul>
<h3 id="a-1-개발-공부-시작-계기-">{A-1: &#39;개발 공부 시작 계기&#39;} ,</h3>
<p>어느 날, 지인의 초대를 받아 뉴욕에 있는 구글 오피스를 방문했다. 업무 환경을 보고, 처음으로 개발자가 멋있어 보였다. 초대해 준 개발자에게 개발을 왜 좋아하는지 물었다. &quot;Why do you like coding?&quot;</p>
<p>&quot;We learn new things everyday. 우리는 매일 새로운 것을 배워.&quot; 라고 대답했다. 프로그래밍 언어는 세계인이 이해할 수 있다는 매력에 빠졌고, 성장에 집착하는 프랭크는, 개발에 겁도 없이 감히... 도전해 보고 싶었다. (<del>이때까지는 몰랐다.. 개발자의 벽을....</del>) </p>
<p>옆에 있는 한국인 개발자에게 공부를 어떻게 하셨는지 여쭤봤다. 본인이 경험한 &#39;쌍용교육센터 국비지원&#39;을 추천해 주셨다. 다른 개발자들의 견해도 듣고 싶어서 판교테크노밸리에서 진행된 이고잉님의 웹 개발 세미나를 참여했다. 성장을 즐기고 지식을 나누는 개발자 생태계 매력에 빠졌고, 쌍용교육센터 면접 일정을 잡았다. </p>
<p>(면접관) - &quot;집이 센터와 상당히 머시군요. 교육과정도 쉽지 않아서 비전공자는 코딩 경험 없이 과정을 따라가기 힘들 수도 있어요.&quot; </p>
<p>면접자분의 말씀에 도전정신이 번쩍 들었고, &quot;센터 근처에 있는 고시원부터 알아보겠습니다. 최선을 다해 포기하지 않고 노력하겠습니다.&quot;라고 말씀드렸다.</p>
<p>(면접관) - &quot;약속할 수 있어요?&quot; 
(프랭크) - &quot;네, 책임감을 가지고 최선을 다하겠습니다.&quot; (<del>&quot;타이슨 - 누구나 그럴싸한 계획을 갖고 있다...</del>&quot;)</p>
<p><strong>이렇게 스펙타클한 개발 여행이 시작됐다.</strong></p>
<h3 id="a-2-험난한-여정의-시작-">{A-2: &#39;험난한 여정의 시작&#39;} ,</h3>
<blockquote>
<p>사우나 뜨거운 물에 깊게 들어갔다 나온 느낌.  정말 뜨거웠다. 그것도 아주 많이......   🔥</p>
</blockquote>
<pre><code>* 교육과정 (880시간) 
1. Java (1~2주)
2. 팀 프로젝트 (2주) 
3. HTML, CSS, JavsScript (1주) 
4. JSP, DB (2주)
5. Spring (2주) 
6. React (1주)
6. 마지막 팀 프로젝트</code></pre><p>면접관이 말씀해 주신 대로 교육과정을 따라가기 숨쉬기 힘들 정도로 어려웠다. 같은 반 교육생들 90% 이상이  전공자였고, 강사님은 중간 실력에 맞춰서 수업을 진행하셨다. 변수가 무엇인지, 어떻게 선언하는지, 왜 선언하는지 조차도 몰랐던 나는 큰 절망감을 느꼈다. 멘붕이었다.</p>
<p>시간이 지나면서 탈락자가 나오기 시작했다. 오기가 생겼던 것일까? 나는 어떻게 해서든 포기하고 싶지 않았다. 무엇보다 중간 탈락자가 되고 싶지 않았다. 프로젝트 팀원들에게 미안하지만 조금이라도 도움이 되고싶었고, 무엇보다 배우고 싶었다.</p>
<p>감사하게도 교육생 친구들은 간단한 질문들까지 성심성의껏 대답해 줬으며 방향성에 도움을 주었다. 강사님도 끝까지 격려를 해주셨다. 감사한 인물들이 많다. </p>
<p>과정이 순탄하지는 않았지만, 탈락하지 않고 수료했다. 백엔드와 프런트엔드의 차이를 정확히 배웠다. </p>
<p>이렇게 소중한 시간을 보냈고, 파란만장한 여정은 시작됐다.</p>
<h3 id="a-3-프런트엔드-">{A-3: &#39;프런트엔드&#39;} ,</h3>
<p>개발이 적성에 맞는지 생각해 본 적이 수 없이 많았다. 악성 바이러스 임포스터 신드롬도 매번 찾아온다. 그럼에도 내가 프런트엔드 개발을 하는 이유는 성격과 관련이 있다.</p>
<ul>
<li><p><strong>커뮤니케이션</strong> 
프런트엔드 개발 직무의 경우 사용자/기획/디자이너/개발자 등과 중간 다리 역할을 수행하는 경우가 있다. 생각을 정중하게 전달하고 이를 설득하는 능력이 빛을 발할 때가 있다고 믿는다. 공감 능력이 중요하다.</p>
<p>나는 사용자의 경험이 비지니스에서 1순위라고 생각한다. 프런트엔드는 사용자와 직접 피드백을 공유하는 1선에 있다. 사용자에게 좋은 영향력을 전달할 수 있는 포지션이라고 생각한다.</p>
<blockquote>
<p> *<em>한마디로 생산적인 소통을 즐긴다. *</em></p>
</blockquote>
</li>
<li><p><strong>도전</strong> 
끊임없는 학습은 프런트엔드 분야에만 국한되지는 않지만, 여타의 개발 분야보다 트렌드의 변화가 상대적으로 빠르다. 프런트엔드는 새로운 기술과 트렌드를 꾸준히 학습하고, 시도해 볼 수 있다는 점이 있다. 다양한 도전을 하는 내 모습이 보인다. </p>
<blockquote>
<p>  <strong>성장을 위해 꾸준히 다양한 도전을 할 수 있다.</strong></p>
</blockquote>
</li>
</ul>
<h3 id="a-4-번아웃-_-개발을-계속할-수-이유-">{A-4: &#39;번아웃 _ 개발을 계속할 수 이유&#39;} ,</h3>
<p>번아웃이란, 일에 지나치게 몰두하던 사람이 어느 시점에서 갑자기 모두 불타버린 연료와 같이 극도의 피로감을 느끼며 무기력해지는 것을 의미하는 용어다.</p>
<p>번아웃은 육체적으로 힘들 때, 불확실성에 오는 불안함, 결과가 보이지 않을 때 찾아 온다고 한다.</p>
<ul>
<li><p>** 가치관  (성장) **
나는 임포스터 신드롬을 겪으면서, 미래에 대한 불확실성이 커지며 번아웃이 여러 번 다녀갔다. 불확실성을 완벽히 제거하기는 쉽지 않다. 하지만, 나의 가치관이 무엇인지 셀프 리마인드를 해주면서 회복한다.</p>
</li>
<li><p><strong>운동 (작은 목표 =&gt; 작은 성취감 반복)</strong>
20kg 이상 감량하기! 물론 살을 빼고 싶었지만... 이렇게 큰 목표가 아니라 작은 단위로, 작은 결과를 스스로에게 자주 보여주려고 노력했다. 지금은 20kg 이상 감량했고 드디어 밴드 없이 턱걸이를 하나씩 할 수 있다. 누군가에게  턱걸이는 10개가 기본 운동일 수 있지만, 나는 내 속도에 맞춰가면 된다. 코딩으로 머릿속 안개가 낄 때, 운동은 절대적으로 도움이 된다. &quot;코딩도 내 속도에 맞춰서 하면 된다.&quot; 라는 마인드 컨트롤도 배우고 있다. 체력도 좋아지는 걸 느낀다.</p>
</li>
<li><p>*<em>써포트 + 커뮤니티 + 봉사활동 *</em>
코딩 공부를 시작하면서 도움을 주신 감사한 분들이 많다. 나이와 국적을 떠나서, 내가 개발자로서 진심으로 성장하길 응원해 주시는 분들이 많다. 개발자 커뮤니티에서 질문을 하면 답이 올 확률은 대부분 90% 이상이다. 개발자는 지식공유를 즐긴다. 앞서 말한 바와 같이 난 지식공유를 좋아한다. 나의 가치관을 감사하게 생각해 준 한 글로벌 커뮤니티에서 admin 제안을 했으며, 현재는 웹 개발을 처음으로 접하는 분들에게 최대한 도움을 줄 수 있는 선에서 선한 영력을 전달하고 있다.</p>
</li>
<li><p><strong>영어 공부</strong>
나는 세계 많은 사람들과 소통 하기 위해서, 직접 부딪히며 수년간 영어를 배우고 있다. 프로그래밍 언어도 마찬가지로 세계인과 소통이 가능하다는 매력이 있다. 영어 공부도 할 수 있는 큰 장점이 있다. </p>
</li>
</ul>
<p><em><strong>나에게 개발이란, 겸손과 감사함을 바탕으로 성장을 도와주는 스승이다. 새로운 것을 매일 배우는게 재밌다.</strong></em></p>
<p><em><strong>개발자로 일하면서 문제를 해결하고, 새로운 기술과 도구를 배우며 성장할 수 있다는 것이 매우 매력적이다. 또한, 개발자로서 사용자의 문제를 해결하고, 그들의 삶을 편리하고 즐겁게 만들 수 있다는 점도 나에겐 큰 의미가 있다.</strong></em></p>
<h3 id="-">] ,</h3>
<h2 id="나를-표현할-수-있는--키워드">&lt; 나를 표현할 수 있는  키워드 &gt;</h2>
<p>무모함 / 추진력 / 실행력 / 자기성장 / 긍정적인 영향력 / 스마일 / 사교성 / 커뮤니티 / 다양한 경험 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 단방향, 양방향 바인딩 (one-way, two-way binding) ]]></title>
            <link>https://velog.io/@frank_kim/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%8B%A8%EB%B0%A9%ED%96%A5-%EC%96%91%EB%B0%A9%ED%96%A5-%EB%B0%94%EC%9D%B8%EB%94%A9-one-way-two-way-binding</link>
            <guid>https://velog.io/@frank_kim/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%8B%A8%EB%B0%A9%ED%96%A5-%EC%96%91%EB%B0%A9%ED%96%A5-%EB%B0%94%EC%9D%B8%EB%94%A9-one-way-two-way-binding</guid>
            <pubDate>Mon, 23 Jan 2023 10:14:54 GMT</pubDate>
            <description><![CDATA[<p>항상 듣기로만 했던 데이터 바인딩. 개념을 조금 더 이해하고자 글로 적게 됐다. 데이터 바인딩에 대해 검색해보니 프런트엔드의 대표 라이브러리 리액트와 프레임워크 엥귤러를 가장 많이 비교했다. 하지만... 리액트만 해본 나로서 앵귤러 시스템을 이해하기 어려웠다.</p>
<h2 id="데이터-바인딩이란">데이터 바인딩이란?</h2>
<ul>
<li><strong>데이터 바인딩은</strong> 화면에 보이는 데이터와 브라우저 메모리에 있는 데이터를 일치시키는 기법</li>
</ul>
<blockquote>
<p>자바스크립트 웹 애플리케이션의 복잡도가 증가하면서 브라우저의 메모리에 있는 여러 개의 자바스크립트 객체와 화면에 있는 데이터를 일치시키기가 매우 어려워졌다. 이러한 어려운 작업을 쉽게 해주는 해결책이 있다면 그건 데이터 바인딩일 것이다. 데이터 바인딩 이란 두 데이터 혹은 정보의 소스를 모두 일치시키는 기법이다. 즉 화면에 보이는 데이터와 브라우저 메모리에 있는 데이터를 일치시키는 기법이다. 많은 자바스크립트 프레임워크가 이러한 데이터 바인딩 기술을 제공하고 있다. </p>
</blockquote>
<h3 id="데이터-바인딩-stackoverflow">데이터 바인딩 (Stackoverflow)</h3>
<p>Can anyone explain the difference between Reacts one-way data binding and Angular&#39;s two-way data binding </p>
<p>구글링을 하던 중 7년전 stackoverflow 유익한 정보를 찾았다. </p>
<p><em>*<em>단반향 (1 way data binding) *</em></em></p>
<ul>
<li>리액트는 부모가 자식으로 props를 전달하는 방법을 선택한다. 부모의 state를 바꾸려면 이벤트를 걸어서, state를 자식에게 전달하고 부모와 자식이 소통을 하게 된다. 여기서 데이터가 흘러가는 방향은 <code>부모 -&gt; 자식</code></li>
</ul>
<p><em>*<em>양반향 (2 ways data binding) *</em></em></p>
<ul>
<li>리액트에서와 달리 앵귤러에서는 이벤트가 필요 없다는 얘기인건가..? 이게 가능하구나..</li>
</ul>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/b89f3814-5a36-4180-8a43-571b33062f72/image.png" alt=""></p>
<h3 id="바인딩-코드로-접하기">바인딩 코드로 접하기</h3>
<p>앵귤러 뭐지..? html을 그냥 막 가져다 쓰는건가..? </p>
<p><em>*<em>단반향 (1 way data binding) *</em></em></p>
<p>리액트는 HTML을 건드리지 않는다. 렌더링에 의존한다. 데이터를 바꾸려면 이벤트가 필요하다.</p>
<blockquote>
<p>React doesn&#39;t have a mechanism to allow the HTML to change the component. The HTML can only raise events that the component responds to. The typical example is by using onChange.</p>
</blockquote>
<pre><code class="language-js">//js
render() { 
    return &lt;input value={this.state.value} onChange={this.handleChange} /&gt;
}

handleChange(e) {
    this.setState({value: e.target.value});
}

  /*
   The value of the `&lt;input /&gt;` is controlled entirely by the render function.
   The only way to update this value is from the component itself, 
   which is done by attaching an onChange event to the `&lt;input /&gt;` 
   which sets this.state.value to with the React component method setState. 
   The `&lt;input /&gt;` does not have direct access to the components state, 
   and so it cannot make changes. This is one-way binding. 
  */</code></pre>
<p><em>*<em>양반향 (2 ways data binding) *</em></em></p>
<p>내가 느낀 엥귤러 양방향 데이터 바인딩은, 가상 DOM이 아닌 오리지널 DOM을 건드리는 것 같다. <code>$scope.name 같은 변수</code>를 직접적으로 건드려서 watcher 기능으로 변화가 있을 때마다 코드를 자동으로 바꿔주는 것 같다.</p>
<blockquote>
<p>Changes to the <code>&lt;input /&gt;</code> are reflected in the $scope.name property automatically, since ng-model sets up watches the input and notifies $scope of the changes. Changes from the code and changes from the HTML are two-way binding. (Check out this fiddle)</p>
</blockquote>
<pre><code class="language-js">//js
$scope.name = &#39;test&#39;;
$timeout(function()  { $scope.name = &#39;another&#39; }, 1000);
$timeout(function()  { console.log($scope.name); }, 5000);

&lt;!-- html ---&gt;
&lt;input ng-model=&quot;name&quot; /&gt;

 /* 
   The input will start out with test, then update to another in 1000ms. 
   Any changes to $scope.name, 
   either from controller code or by changing the input, 
   will be reflected in the console log 4000ms later. 
 */</code></pre>
<h3 id="장단점특징">장단점/특징</h3>
<p><em>*** 단방향 **</em></p>
<p><strong>장점 : 데이터 변화에 따른 성능 저하 없이 DOM 객체 갱신 가능, 데이터 흐름이 단방향(부모-&gt;하위 컴포넌트)이라, 코드를 이해하기 쉽고 데이터 추적과 디버깅이 쉬움
단점: 변화를 감지하고 화면을 업데이트 하는 코드를 매번 작성해야 함</strong></p>
<ul>
<li><p>컴포넌트 내에서 &#39;단방향 데이터 바인딩&#39;은 Javascript(Model)에서 HTML(View)로 한 방향으로만 데이터를 동기화하는 것을 의미함. <code>[JS(Model) -&gt; HTML(View)]</code></p>
</li>
<li><p>💡 단방향 데이터 바인딩이기에 역으로 HTML(View)에서 JS(Model)로의 직접적인 데이터 갱신은 불가능. <code>이벤트 함수(onClick, onChange,...)</code>를 주고 함수를 호출한 뒤 <strong>Javascript에서 HTML로 데이터를 변경해야 함.</strong> <code>[HTML(View) -&gt; JS(Model)]</code></p>
</li>
<li><p>💡 컴포넌트 간에서 단방향 데이터 바인딩은 부모 컴포넌트에서 자식 컴포넌트로만 데이터가 전달되는 구조.</p>
</li>
</ul>
<p><em>*** 양방향 **</em></p>
<p><strong>장점 : 코드의 사용면에서 코드량을 크게 줄여줌
단점 : 변화에 따라 DOM 객체 전체를 렌더링해주거나 데이터를 바꿔주므로, 성능이 감소되는 경우가 있음</strong></p>
<ul>
<li>💡 컴포넌트 내에서 &#39;양방향 데이터 바인딩&#39;은 Javascript(Model)와 HTML(View) 사이에 ViewModel이 존재하여 하나로 묶여서(Binding) 되어서 둘 중 하나만 변경되어도 함께 변경되는 것을 의미. 
<code>[HTML(View) &lt;-&gt; ViewModel &lt;-&gt; Javascript(Model)]</code></li>
<li>💡 컴포넌트 간에서는 부모 컴포넌트에서 자식 컴포넌트로는 Props를 통해 데이터를 전달하고, 자식 컴포넌트에서 부모 컴포넌트로는 Emit Event를 통해서 데이터를 전달하는 구조.</li>
</ul>
<h3 id="느낀점">느낀점</h3>
<p>솔직히.. 엥귤러를 직접 코드로 짜보지 않아서 아직까지는 100% 와닿지 않는다. 하지만, 컴포넌트 내부에서 혹은 컴포넌트 간에 데이터 바인딩을 이해한다면 보는 시야가 넓어지지 않을까</p>
<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://stackoverflow.com/questions/34519889/can-anyone-explain-the-difference-between-reacts-one-way-data-binding-and-angula">https://stackoverflow.com/questions/34519889/can-anyone-explain-the-difference-between-reacts-one-way-data-binding-and-angula</a></li>
<li><a href="https://dzone.com/articles/explaining-data-binding-and-server-rendering-in-an-2">https://dzone.com/articles/explaining-data-binding-and-server-rendering-in-an-2</a></li>
<li><a href="https://poiemaweb.com/angular-component-data-binding">https://poiemaweb.com/angular-component-data-binding</a></li>
<li><a href="https://authorkim0921.tistory.com/13">https://authorkim0921.tistory.com/13</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 성능 분석 체크]]></title>
            <link>https://velog.io/@frank_kim/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%84%B1%EB%8A%A5-%EB%B6%84%EC%84%9D-%EC%B2%B4%ED%81%AC</link>
            <guid>https://velog.io/@frank_kim/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%84%B1%EB%8A%A5-%EB%B6%84%EC%84%9D-%EC%B2%B4%ED%81%AC</guid>
            <pubDate>Sun, 22 Jan 2023 16:48:56 GMT</pubDate>
            <description><![CDATA[<h3 id="자바스크립트-성능-확인">자바스크립트 성능 확인</h3>
<pre><code class="language-js">const t0 = performance.now()
console.time(&#39;test&#39;)
let num = 1000, arr = [];

for (let i = 0; i &lt; 10000; i++) {

    arr[i] = num.toString();
  // arr[i] = num + &#39;&#39; 
  // arr[i] = String(1000);

}
const t1 = performance.now()
console.log(t1 - t0, &#39;milliseconds&#39;)
console.timeEnd(&#39;test&#39;)</code></pre>
<h3 id="reference">Reference</h3>
<ul>
<li><a href="http://jindo.dev.naver.com/jsMatch/index.html">http://jindo.dev.naver.com/jsMatch/index.html</a></li>
<li><a href="https://velog.io/@zuyonze/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%98%EB%AC%B8-glk00t4bxk">https://velog.io/@zuyonze/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%98%EB%AC%B8-glk00t4bxk</a></li>
<li><a href="https://yceffort.kr/2020/12/measuring-performance-of-javascript-functions">https://yceffort.kr/2020/12/measuring-performance-of-javascript-functions</a></li>
<li><a href="https://12bme.tistory.com/134">https://12bme.tistory.com/134</a></li>
<li><a href="https://mingggu.tistory.com/127">https://mingggu.tistory.com/127</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[NaN - isNaN - Number.isNaN 조심하기]]></title>
            <link>https://velog.io/@frank_kim/NaN-isNaN-Number.isNaN-%EC%A1%B0%EC%8B%AC%ED%95%B4%EC%95%BC%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@frank_kim/NaN-isNaN-Number.isNaN-%EC%A1%B0%EC%8B%AC%ED%95%B4%EC%95%BC%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Sun, 22 Jan 2023 16:13:16 GMT</pubDate>
            <description><![CDATA[<h2 id="nan---isnan---numberisnan-조심-또-조심">NaN - isNaN - Number.isNaN 조심 또 조심...</h2>
<p>자바스크립트 so strange.. 10일만에 만들어져서 그런가...? </p>
<p>정의를 보면.. NaN는 &#39;Not-a-Number&#39;의 줄임말. 그러면 number가 아니라는건데...</p>
<h3 id="nan">NaN</h3>
<ul>
<li>NaN is not a number. </li>
<li>typeof(NaN) should not be a number. </li>
<li><code>console.log(typeof NaN) - &quot;number&quot;</code> 응.....? number 타입이라고..?</li>
</ul>
<h3 id="isnan">isNaN()</h3>
<ul>
<li>isNaN() 함수는 값이 NaN(Not a Number)인지 판별한다.</li>
<li>false 리턴 하면 숫자, true 리턴하면 숫자가 아니라는건가? </li>
<li>MDN에서도 아주 혼란스럽고, 완전히 신뢰할 수 없다고 나온다. ㅋㅋㅋㅋ</li>
</ul>
<blockquote>
</blockquote>
<p><strong><code>Summary:</code></strong> <em><strong>Number() parsing 과정을 거친다.</strong></em> </p>
<ul>
<li>isNaN(&quot;&quot;) -&gt; 거짓: 빈 문자열은 NaN이 아닌 0으로 변환된다.</li>
<li>isNaN(&quot; &quot;) -&gt; 거짓: 공백이 있는 문자열은 NaN이 아닌 0으로 변환된다.</li>
<li>isNaN(null) -&gt; 거짓</li>
<li>isNaN(&quot;37&quot;) -&gt; 거짓: &quot;37&quot;은 NaN이 아닌 숫자 37로 변환된다</li>
</ul>
<pre><code>x                    Number(x)    isNaN(x)
undefined                NaN          true
{}                        NaN          true
&#39;foo&#39;                    NaN          true
new Date(&#39;&#39;)            NaN          true
new Number(0/0)            NaN          true</code></pre><pre><code class="language-js">console.log(isNaN(0)); // false 
console.log(isNaN(1)); // false 
console.log(isNaN(&#39;100&#39;)); // false 

isNaN(NaN);       // 참
isNaN(undefined); // 참
isNaN({});        // 참

isNaN(true);      // 거짓
isNaN(null);      // 거짓
isNaN(37);        // 거짓

// 문자열
isNaN(&quot;37.37&quot;);   // 거짓: &quot;37.37&quot;은 NaN이 아닌 숫자 37.37로 변환된다.
isNaN(&quot;123ABC&quot;);  // 참: parseInt(&quot;123ABC&quot;)는 123이지만 Number(&quot;123ABC&quot;)는 NaN.
isNaN(&quot;&quot;);        // 거짓: 빈 문자열은 NaN이 아닌 0으로 변환된다.
isNaN(&quot; &quot;);       // 거짓: 공백이 있는 문자열은 NaN이 아닌 0으로 변환된다.

// 이것이 허위 양성이고 isNaN이 완전히 신뢰할 수 없는 이유이다.
isNaN(&quot;blabla&quot;)   // 참: &quot;blabla&quot;는 숫자로 변환.
                  // 이것을 숫자롯 parsing 하는 것을 실패하고 NaN을 반환.</code></pre>
<h3 id="numberisnan">Number.isNaN()</h3>
<p>잠깐만.. 정의부터 다시 읽어보자..</p>
<ul>
<li><code>주어진 값의 유형이 Number이고, 값이 NaN이면 true, 아니면 false.</code></li>
<li>Number 형에서만 사용가능하고 강제로 Number 변환을 시도하지 않는다.</li>
<li>기존부터 존재한 전역 isNaN() 함수의 더 엄격한 버전.</li>
<li>NaN이 NaN인지 계산할 때, 두 동일 연산자 ==과 === 모두 false로 평가되므로 값의 NaN 여부를 알아내려면 Number.isNaN()이 필요함.</li>
</ul>
<pre><code>                |       Number.isNaN()       |        isNaN()
----------------+----------------------------+-----------------------
value           | value is a Number | result | Number(value) | result
----------------+-------------------+--------+---------------+-------
undefined       | false             | false  | NaN           | true
{}              | false             | false  | NaN           | true
&quot;blabla&quot;        | false             | false  | NaN           | true
new Date(&quot;!&quot;)   | false             | false  | NaN           | true
new Number(0/0) | false             | false  | NaN           | true</code></pre><pre><code class="language-js">Number.isNaN({});
// &lt;- false, {} is not NaN
Number.isNaN(&#39;ponyfoo&#39;)
// &lt;- false, &#39;ponyfoo&#39; is not NaN
Number.isNaN(NaN)
// &lt;- true, NaN is NaN
Number.isNaN(&#39;pony&#39;/&#39;foo&#39;)
// &lt;- true, &#39;pony&#39;/&#39;foo&#39; is NaN, NaN is NaN

isNaN({});
// &lt;- true, {} is not a number
isNaN(&#39;ponyfoo&#39;)
// &lt;- true, &#39;ponyfoo&#39; is not a number
isNaN(NaN)
// &lt;- true, NaN is not a number
isNaN(&#39;pony&#39;/&#39;foo&#39;)
// &lt;- true, &#39;pony&#39;/&#39;foo&#39; is NaN, NaN is not a number</code></pre>
<h3 id="아직도-헷갈리는-부분">아직도 헷갈리는 부분...</h3>
<p>Number.isNaN()는 Number 타입중에 isNaN을 찾는걸로 이해했는데.....</p>
<pre><code class="language-js">Number.isNaN(&#39;pony&#39;/&#39;foo&#39;)
// &lt;- true, &#39;pony&#39;/&#39;foo&#39; is NaN, NaN is NaN</code></pre>
<blockquote>
</blockquote>
<ul>
<li>isNaN() converts the argument to a Number and returns true if the resulting value is NaN.</li>
<li>Number.isNaN() does not convert the argument; it returns true when the argument is a Number and is NaN.</li>
</ul>
<p>많이 읽어도... 헷갈리는건.. MDN이 이해해주지만 그래도 헷갈린다..</p>
<pre><code class="language-js">// polyfills
if(!Number.isNaN) {
  Number.isNaN = function(n) {
    if( typeof n === &quot;number&quot; ) {
      return window.isNaN(n)
    } 
    return false
  }
}</code></pre>
<h3 id="reference">Reference</h3>
<ul>
<li><a href="https://www.codementor.io/@diegopalacios/nan-isnan-number-isnan-1agz7vzs08">https://www.codementor.io/@diegopalacios/nan-isnan-number-isnan-1agz7vzs08</a></li>
<li><a href="https://www.designcise.com/web/tutorial/what-is-the-difference-between-isnan-and-number-isnan-in-javascript">https://www.designcise.com/web/tutorial/what-is-the-difference-between-isnan-and-number-isnan-in-javascript</a></li>
<li><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN</a></li>
<li><a href="https://stackoverflow.com/questions/33164725/confusion-between-isnan-and-number-isnan-in-javascript">https://stackoverflow.com/questions/33164725/confusion-between-isnan-and-number-isnan-in-javascript</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TMDB - Create API  키 생성 & 사용 - The Movie DB]]></title>
            <link>https://velog.io/@frank_kim/TMDB-Create-API-%ED%82%A4-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9-The-Movie-DB</link>
            <guid>https://velog.io/@frank_kim/TMDB-Create-API-%ED%82%A4-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9-The-Movie-DB</guid>
            <pubDate>Thu, 29 Dec 2022 04:35:21 GMT</pubDate>
            <description><![CDATA[<h1 id="tmdb---api-키-생성하기">TMDB - API 키 생성하기</h1>
<p>*<em>Step by step 따라하기. *</em></p>
<p>TMDB : <a href="https://www.themoviedb.org/">https://www.themoviedb.org/</a>
API 사용하기: <a href="https://developers.themoviedb.org/3/getting-started/introduction">https://developers.themoviedb.org/3/getting-started/introduction</a></p>
<h3 id="1회원가입하기">1.회원가입하기</h3>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/75326746-9b99-4b13-a2ae-7dcf6eb07de9/image.png" alt=""></p>
<h3 id="2-회원가입-후-이메일-가서-activate-my-account-해야함">2. 회원가입 후, 이메일 가서 Activate My Account 해야함.</h3>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/f8af9579-6d7e-4271-b26e-08fa474c762c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/5e53e8c1-9a8d-4847-a921-2c25c4a94789/image.png" alt=""></p>
<h3 id="3-로그인하기---프로필-누르기---settings">3. 로그인하기 -&gt; 프로필 누르기 -&gt; Settings</h3>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/b4300f45-0855-497e-b00b-9b6c00058f23/image.png" alt=""></p>
<h3 id="4-settings---api-클릭---developer-클릭---create-클릭">4. Settings -&gt; API 클릭 -&gt; Developer 클릭 -&gt; Create 클릭</h3>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/f91f7d10-bf75-4921-bbaf-0a508a4fb426/image.png" alt=""></p>
<h3 id="5-api-키-생성하기">5. API 키 생성하기</h3>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/0cccbeba-87b7-4cea-a508-29e102309796/image.png" alt=""></p>
<h3 id="6-키-생성하면-바로-api-key를-보여줌">6. 키 생성하면, 바로 API key를 보여줌.</h3>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/450057e5-ba42-4357-9c39-a9eadd8a8e50/image.png" alt=""></p>
<h3 id="7-api-key를-생성하면-이메일이-날라옴---view-reply">7. API key를 생성하면, 이메일이 날라옴. -&gt; VIEW REPLY</h3>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/52855efc-4ee6-404b-b30a-3ebc87d5d0e8/image.png" alt=""></p>
<h3 id="8-api-key-와-api-사용에-필요한-링크를-공유해줌">8. API key 와, API 사용에 필요한 링크를 공유해줌</h3>
<p><img src="https://velog.velcdn.com/images/frank_kim/post/5500af18-057e-4476-ba58-623bb31a82b6/image.png" alt=""></p>
<h2 id="enjoy-learning">Enjoy learning!</h2>
<p>TMDB : <a href="https://www.themoviedb.org/">https://www.themoviedb.org/</a>
API 사용하기: <a href="https://developers.themoviedb.org/3/getting-started/introduction">https://developers.themoviedb.org/3/getting-started/introduction</a></p>
]]></description>
        </item>
    </channel>
</rss>