<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>HYEJIN's</title>
    <link>https://hyejin-dev.tistory.com/</link>
    <description>프론트엔드 개발자</description>
    <language>ko</language>
    <pubDate>Wed, 12 Aug 2026 19:04:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hyejin_dev</managingEditor>
    <image>
      <title>HYEJIN's</title>
      <url>https://tistory1.daumcdn.net/tistory/3056738/attach/9cbf16da067d4e38b6483d4685181dcb</url>
      <link>https://hyejin-dev.tistory.com</link>
    </image>
    <item>
      <title>Spring - DAO, DTO, VO 개념 정리</title>
      <link>https://hyejin-dev.tistory.com/17</link>
      <description>&lt;h2 id=&quot;dao&quot; data-ke-size=&quot;size26&quot;&gt;DAO&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DAO(Data Access Object)&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 &lt;u&gt;데이터베이스의 data에 접근하기 위한 객체&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DataBase에 접근 하기 위한 로직 &amp;amp; 비지니스 로직&lt;/b&gt;을 분리하기 위해 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dto&quot; data-ke-size=&quot;size26&quot;&gt;DTO&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DTO(Data Transfer Object)&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 계층 간 데이터 교환을 하기 위해 사용하는 객체로, &lt;br /&gt;DTO는 &lt;u&gt;로직을 가지지 않는 순수한 데이터 객체 &lt;/u&gt;(getter &amp;amp; setter 만 가진 클래스)&lt;/li&gt;
&lt;li&gt;유저가 입력한 데이터를 DB에 넣는 과정&lt;br /&gt;&lt;i&gt;1. 유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송&lt;/i&gt;&lt;br /&gt;&lt;i&gt;2. 해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣음&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;vo&quot; data-ke-size=&quot;size26&quot;&gt;VO&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VO(Value Object)&lt;span&gt;&amp;nbsp;&lt;/span&gt;값 오브젝트로써 값을 위해 쓰임&lt;/li&gt;
&lt;li&gt;read-Only 특징(사용하는 도중에 변경 불가능하며 오직 읽기만 가능)을 가짐&lt;/li&gt;
&lt;li&gt;DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할 수 있음&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Spring</category>
      <category>DAO</category>
      <category>database</category>
      <category>DTO</category>
      <category>getter</category>
      <category>object</category>
      <category>SETTER</category>
      <category>spring</category>
      <category>VO</category>
      <author>hyejin_dev</author>
      <guid isPermaLink="true">https://hyejin-dev.tistory.com/17</guid>
      <comments>https://hyejin-dev.tistory.com/17#entry17comment</comments>
      <pubDate>Tue, 18 Oct 2022 12:54:10 +0900</pubDate>
    </item>
    <item>
      <title>Vanilla JS 순수 바닐라 - jQuery를 Javascript로 !</title>
      <link>https://hyejin-dev.tistory.com/16</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;바닐라 자바스크립트 Vanilla JS?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바닐라 자바스크립트(Vanilla JS)란 프레임워크 또는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브러리가 적용되지 않은 순수한 자바스크립트를 뜻한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 선택자&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;div id=&quot;app&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;container&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;// jQuery
$(&quot;#app&quot;);
$(&quot;.container&quot;);

// Jacascript
document.getElementById(&quot;app&quot;);
document.querySelector(&quot;#app&quot;);

document.getElementsByClassName(&quot;container&quot;);
document.querySelector(&quot;.container&quot;);
document.querySelectorAll(&quot;.container&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jQuery&lt;br /&gt;&lt;code&gt;.siblings()&lt;/code&gt; : 형제 요소 중 지정한 선택자 모두 선택&lt;br /&gt;&lt;code&gt;.next()&lt;/code&gt; : 다음 형제 요소 모두 선택&lt;br /&gt;&lt;code&gt;.nextAll()&lt;/code&gt; : 다음 형제 요소 모두 선택&lt;br /&gt;&lt;code&gt;.nextUntil()&lt;/code&gt; : 형제 요소 중 지정한 선택자에 해당하는 요소 바로 이전까지의 요소 모두 선택&lt;br /&gt;&lt;code&gt;.prev()&lt;/code&gt; : 이전에 위치한 형제 요소 선택&lt;br /&gt;&lt;code&gt;.prevAll()&lt;/code&gt; : 이전에 위치한 형제 요소 모두 선택&lt;br /&gt;&lt;code&gt;.prevUntil()&lt;/code&gt; : 형제 요소 중 지정한 선택자에 해당하는 요소 바로 다음까지의 요소 모두 선택&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript&lt;br /&gt;&lt;code&gt;parentNode&lt;/code&gt; : 부모 노드&lt;br /&gt;&lt;code&gt;childNodes&lt;/code&gt; : 자식 노드 리스트&lt;br /&gt;&lt;code&gt;firstChild&lt;/code&gt; : 첫 번째 자식 노드&lt;br /&gt;&lt;code&gt;lastChild&lt;/code&gt; : 마지막 자식 노드&lt;br /&gt;&lt;code&gt;nextSibling&lt;/code&gt; : 다음 형제 노드&lt;br /&gt;&lt;code&gt;previousSibling&lt;/code&gt; : 이전 형제 노드&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. data 속성 값&lt;/h4&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;&amp;lt;div data-user-name=&quot;Vanilla&quot;&amp;gt;Hello&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;// jQuery
$(&quot;div&quot;).data(&quot;user-name&quot;);

// Javascript
document.querySelector(&quot;div&quot;).dataset.userName;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Event&lt;/h4&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// jQuery
$(function() {

});

// Javascript
document.addEventListener(&quot;DOMContentLoaded&quot;, () =&amp;gt; {

});&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;// jQuery
$(&quot;.btn&quot;).off().on(&quot;click&quot;, e =&amp;gt; {

});

// Javascript
document.querySelector(&quot;.btn&quot;).addEventListener(&quot;click&quot;, e =&amp;gt; {

});

// 다른곳에서 이벤트 방출(emit) - 똑같이 click();
$(&quot;.btn&quot;).click(); 
document.querySelector(&quot;.btn&quot;).click();&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 배열&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;// jQuery
$(&quot;li&quot;).each( (idx, item) =&amp;gt; {

});

// Javascript
Array.from(document.querySelectorAll(&quot;li&quot;)).forEach( (inx, item) =&amp;gt; {

});&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 비동기 요청&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;// jQuery
$.ajax({
    url: &quot;./test.jsp&quot;,
    type: &quot;GET&quot;,
    cache: false,
    dataType: &quot;json&quot;,
    data: &quot;&quot;,
    success: function(data){

    },
    error: function (request, status, error){        

    }
});


// Javascript
const req = new XMLHttpRequest();
req.open(&quot;GET&quot;, &quot;/resource&quot;, true);
req.onreadystatechange = () =&amp;gt; {
  if (req.readyState == 4) { 
        if (req.status == 200 || req.status == 201){
            console.log('success');
        }
        else {
            console.log('fail');
        }                    
    }
}
req.send(null);

// req.setRequestHeader(&quot;Content-Type&quot;, &quot;application/json&quot;);            
// req.send(JSON.stringify(jsonData));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>JavaScript</category>
      <category>javascript</category>
      <category>jQuery</category>
      <category>Vanilla</category>
      <category>vanilla js</category>
      <category>바닐라 자바스크립트</category>
      <category>순수바닐라</category>
      <category>제이쿼리</category>
      <author>hyejin_dev</author>
      <guid isPermaLink="true">https://hyejin-dev.tistory.com/16</guid>
      <comments>https://hyejin-dev.tistory.com/16#entry16comment</comments>
      <pubDate>Thu, 4 Aug 2022 23:27:28 +0900</pubDate>
    </item>
    <item>
      <title>카페24 - 변수 수정하기(고급 활용법) | 모디파이어 꿀팁</title>
      <link>https://hyejin-dev.tistory.com/15</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;모디파이어란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수들의 데이터 형태를 다양화하기 위해 여러 형태의 모디파이어를 제공합니다.&lt;br /&gt;디자인 편집창에서 변수의 &quot;}&quot; 전에 | (shift + ￦) 를 사용하면 모디파이어 목록이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;font-size: 1.12em; letter-spacing: 0px;&quot;&gt;. cut&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을&amp;nbsp;표현할&amp;nbsp;개수만큼&amp;nbsp;잘라서&amp;nbsp;출력&lt;/p&gt;
&lt;pre id=&quot;code_1659534936753&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{$product_name|cut:10,...}&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;size18&quot;&gt;&lt;b&gt;3. Date&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜변환&lt;/p&gt;
&lt;pre id=&quot;code_1659534968448&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{$write_date|date:Y-m-d}
{$foo|date:Y-m-d H:i:s}

// |date:년-월-일 시간:분:초&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. Numberformat&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상품&amp;nbsp;판매가에&amp;nbsp;천단위&amp;nbsp;콤마를&amp;nbsp;사용&lt;/p&gt;
&lt;pre id=&quot;code_1659535009048&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{$product_price|numberformat}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;5.&amp;nbsp; &lt;/span&gt;Replace&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을&amp;nbsp;치환&lt;/p&gt;
&lt;pre id=&quot;code_1659535036363&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{$foo|replace:a,b}
{$notice_icon|replace:공지,공지사항}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Cafe24</category>
      <category>모디파이어</category>
      <category>변수</category>
      <category>변수수정</category>
      <category>변수활용</category>
      <category>카페24</category>
      <author>hyejin_dev</author>
      <guid isPermaLink="true">https://hyejin-dev.tistory.com/15</guid>
      <comments>https://hyejin-dev.tistory.com/15#entry15comment</comments>
      <pubDate>Thu, 4 Aug 2022 20:45:12 +0900</pubDate>
    </item>
    <item>
      <title>React 완벽정리 (react란? 장점, 단점 등)</title>
      <link>https://hyejin-dev.tistory.com/3</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. React?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React는 페이스북에서 개발한 유저인터페이스 라이브러리로서 개발자로 하여금 재사용 가능한 UI를 생성 할 수 있게 해줍니다.&lt;br /&gt;이 라이브러리는 현재 페이스북, 인스타그램, 야후, 넷플릭스를 포함한 많은 큰 서비스에서 사용되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 라이브러리는 &lt;b&gt;Virtual DOM&lt;/b&gt; 이라는 개념을 사용하여 상태의 변함에 따라 선택적으로 유저인터페이스를 렌더링합니다. 따라서, 최소한의 DOM 처리로 컴포넌트들을 업데이트 할 수 있게 해줍니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1-2. React-native?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모바일 웹을 만들도록 도와주는 library&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Virtual DOM은 어떻게 작동하지?&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;데이터가 업데이트되면, 전체 UI 를 Virtual DOM 에 리렌더링 합니다.&lt;br /&gt;이전 Virtual DOM 에 있던 내용과 현재의 내용을 비교합니다.&lt;br /&gt;바뀐 부분만 실제 DOM 에 적용이 됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무조건 위의 3가지가 처리 되는것이 아니라 개발하는것에 따라 무조건 전체 렌더링 할 수도 있음&lt;br /&gt;실제 DOM을 처리하는 건 비용이 많이 들고 느림&lt;br /&gt;처리해야할 데이터가 많아지면 더 많은 부담이 되는 것을 줄여줌&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 특징&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;JSX&lt;/b&gt; - JSX는 JavaScript의 Syntax 확장입니다. JSX를 사용하는것이 필수는 아니지만, 사용하는것이 권장됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Components&lt;/b&gt; - React는 전부 Component에 대한 것 입니다. React 개발을 할땐 모든것을 Component로서 생각해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단일방향 (Unidirectional) 데이터 흐름 &amp;amp; Flux&lt;/b&gt; - React에선 데이터가 단일방향으로만 흐릅니다. 데이터 흐름을 단방향으로 제한함으로서 데이터를 추적하기 쉽고 디버깅을 쉽게 해줍니다. Flux는 데이터가 단일방향으로 흐르는것을 유지해주는 패턴입니다. ( Flux에 대해선 나중에 자세히 알아보겠습니다. )&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 장점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;React는 JavaScript 객체 형태의 Virtual DOM 을 사용하여 어플리케이션의 성능을 향상시킴 (JavaScript Virtual DOM 처리가 실제 DOM 보다 빠르기 때문)&lt;/li&gt;
&lt;li&gt;서버 &amp;amp; 클라이언트 사이드 렌더링 지원을 통해 브라우저측의 초기 렌더링 딜레이를 줄이고, SEO 호환도 가능해짐&lt;/li&gt;
&lt;li&gt;Component 의 가독성이 매우 높고 간단하여 쉬운 유지보수, 간편한 UI 수정 및 재사용 용이&lt;/li&gt;
&lt;li&gt;React는 프레임워크가 아닌 라이브러리기 때문에 다른 프레임워크와 혼용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 단점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VIEW ONLY , VIEW 이외의 기능은 써드파티 라이브러리(Third party library, =패키지, 모듈로 불리기도함)를 이용하거나 직접 구현해야함&lt;/li&gt;
&lt;li&gt;IE8 이하 지원하지 않음 (IE8 이하 버전을 지원해야 할 경우 v0.14 버전을 사용 해야함)&lt;/li&gt;
&lt;li&gt;React는 inline-template 과 JSX 를 사용하는데, 일부 개발자들에게는 적응이 안 될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. Babel&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2015년에 업데이된 ES6를 사용할 때, 이전 문법인 ES5로 변환해주는 변환장치(Preprocessor) 최신버전의 크롬이나 파이어폭스는 지원하지만, 구 버전의 브라우저나 IE를 위해 변환함&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Hello World&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import React from 'react';    // var React = require('react');  와 동일  

function HelloWorld (props) {   
    return ( &amp;lt;h1&amp;gt;Hello {props.name}!&amp;lt;/h1&amp;gt; ); 
}  

export default HelloWorld;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;webpack 이라는 도구를 사용하여 마치 Node.js 에서 require 하는것과 같이 모듈을 불러올 수 있게 하는 것!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;용어정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;번들링(bundling)&lt;/code&gt; : webpack 은 이렇게 import(혹은 require) 한 모듈들을 불러와서 한 파일로 합치는 작업&lt;br /&gt;&lt;code&gt;프롭스(props)&lt;/code&gt; : 변수&lt;/p&gt;</description>
      <category>React</category>
      <category>react</category>
      <category>react-native</category>
      <category>Virtual Dom</category>
      <category>가상돔</category>
      <category>기본개념</category>
      <category>단점</category>
      <category>완벽정리</category>
      <category>장점</category>
      <author>hyejin_dev</author>
      <guid isPermaLink="true">https://hyejin-dev.tistory.com/3</guid>
      <comments>https://hyejin-dev.tistory.com/3#entry3comment</comments>
      <pubDate>Wed, 3 Aug 2022 21:11:39 +0900</pubDate>
    </item>
    <item>
      <title>React - Lifeycle API  class/hooks 알아보기</title>
      <link>https://hyejin-dev.tistory.com/13</link>
      <description>&lt;h2&gt;LifeCycle API (class)&lt;/h2&gt;
&lt;p&gt;eact의 컴포너트는 생명주기(Life cycle)을 가진다. 생명주기란 컴포넌트가 생성되고 사용되고 소멸될 때 까지 일련의 과정을 말한다.&lt;br&gt;이러한 생명주기 안에서는 특정 시점에 자동으로 호출되는 메서드가 있는데, 이를 라이프 사이클 이벤트라고 한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;클래스의 경우 -&amp;gt; constructor -&amp;gt; render -&amp;gt; ref -&amp;gt; componentDidMount&lt;br&gt;setState/props 바뀔때 - shouldComponentUpdate -&amp;gt; (true) -&amp;gt; render -&amp;gt; componentDidUpdate&lt;br&gt;부모가 나를 없앴을 때 - componentWillUnmount -&amp;gt; 소멸&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;class Test extends Component {
  state = { };

  // 컴포넌트가 첫 렌더링 된 후, 비동기 요청을 많이함
  componentDidMount(){

  }

  // props 또는 state가 변경되었을 때, 재랜더링 여부를 return 값으로 결정함 , 컴포넌트 업데이트 직전에 호출
  shouldComponentUpdate(nextProps, nextState, nextContext) {
      return true;
  }

  // 리렌더링 후
  componentDidUpdate(){

  }

  // 컴render() { 
        return (  );
    }을 없앴을때), 비동기 요청 정리를 많이함
  componentWillUnmount(){

  }

  render() { 
      return (  );
  }

}

export default Test;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;shouldComponentUpdate(nextProps, nextState, nextContext)&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;: 구성요소를 업데이트해야 합니까?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;컴포넌트 업데이트 직전에 호출되는 메소드&lt;/li&gt;
&lt;li&gt;props 또는 state가 변경되었을 때, &lt;strong&gt;재랜더링 여부&lt;/strong&gt;를 return 값으로 결정함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ComponentDidMount()&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;: 구성요소가 탑재됨&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;컴포넌트가 맨 처음 DOM에 redering된 후 호출되는 메소드&lt;/li&gt;
&lt;li&gt;setState()를 해도 이 부분은 다시 render 되지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;// 외부 라이브러리 연동: D3, masonry, etc&lt;br&gt;// 컴포넌트에서 필요한 데이터 요청: Ajax, GraphQL, etc&lt;br&gt;// DOM 에 관련된 작업: 스크롤 설정, 크기 읽어오기 등&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;componentWillMount()&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;: 구성 요소가 탑재됩니다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;React 엘리먼트를 실제 DOM 노드에 추가하기 직전에 호출되는 메소드&lt;/li&gt;
&lt;li&gt;DOM이 생성되지 않았으므로 DOM을 조작할 수 없다&lt;/li&gt;
&lt;li&gt;render가 호출되기 전이기 때문에 setState를 사용해도 render가 호출하지 않음&lt;/li&gt;
&lt;li&gt;현재 사용 거의 안함 / v16.3 이후부터는 &lt;code&gt;UNSAFE_componentWillMount()&lt;/code&gt; 라는 이름으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;LifeCycle API (hooks)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;useEffect 는 여러번 사용이 가능하다 (다른 효과를 주고싶을 때)&lt;/li&gt;
&lt;li&gt;[] 안에 여러게 사용도 가능하다 ex) [imgCoord, result, score]&lt;/li&gt;
&lt;li&gt;배열에는 꼭 useEfect를 다시 실행할 값만 넣기!&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// class
componentDIdMount() {
  this.setState({
    imgCoord: 3,
    score: 1,
    result: 2,
  })
}

// hooks
userEffect( () =&amp;gt; {
  setImgCoord();
  setScore();
}, [imgCoord, score]);

userEffect( () =&amp;gt; {
    setResult();
}, [result]);&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// componentDidMount, componentDidUpdate (1대1 대응은 아님)
useEffect( () =&amp;gt; {
  interval.current = setInterval(changeHand, 100);

  return () =&amp;gt; { // componentWillUnmount 역할
      clearInterval(interval.current);
  }
}, [imgCoord]);

// [] 안에 아무것도 적지않으면 처음 한번만 실행하고 실행하지않겠따!
// [] 안에 값이 바뀔때마다 실행됨!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://reactjs.org/docs/state-and-lifecycle.html#adding-lifecycle-methods-to-a-class&quot;&gt;React 공식문서 - State and Lifecycle&lt;/a&gt;&lt;/p&gt;</description>
      <category>React</category>
      <category>API</category>
      <category>class</category>
      <category>ComponentDidMount</category>
      <category>ComponentWillUnmount</category>
      <category>hooks</category>
      <category>lifecycle</category>
      <category>react</category>
      <category>shouldComponentUpdate</category>
      <category>useEffect()</category>
      <category>리엑트</category>
      <author>hyejin_dev</author>
      <guid isPermaLink="true">https://hyejin-dev.tistory.com/13</guid>
      <comments>https://hyejin-dev.tistory.com/13#entry13comment</comments>
      <pubDate>Fri, 16 Aug 2019 10:51:56 +0900</pubDate>
    </item>
    <item>
      <title>Node로의 접근 완벽 정리! (parentNode,nextSibling...nodeType)</title>
      <link>https://hyejin-dev.tistory.com/12</link>
      <description>&lt;h2&gt;Node로의 접근&lt;/h2&gt;
&lt;p&gt;HTML 문서에서 HTML DOM 노드에 접근하는 방법 2가지&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;getElementsByTagName() 메소드를 이용하는 방법&lt;/li&gt;
&lt;li&gt;노드 간의 관계를 이용하여 접근하는 방법&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;parentNode&lt;/code&gt; : 부모 노드&lt;br /&gt;
&lt;code&gt;childNodes&lt;/code&gt; : 자식 노드 리스트&lt;br /&gt;
&lt;code&gt;firstChild&lt;/code&gt; : 첫 번째 자식 노드&lt;br /&gt;
&lt;code&gt;lastChild&lt;/code&gt; : 마지막 자식 노드&lt;br /&gt;
&lt;code&gt;nextSibling&lt;/code&gt; : 다음 형제 노드&lt;br /&gt;
&lt;code&gt;previousSibling&lt;/code&gt; : 이전 형제 노드&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nodeName (노드 고유의 이름을 저장하므로, 수정할 수 없는 읽기 전용 프로퍼티)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// HTML 문서의 모든 자식 노드 중에서 두 번째 노드의 이름을 선택함.
document.getElementById(&quot;document&quot;).innerHTML = document.childNodes[1].nodeName;           // HTML
 
// html 노드의 모든 자식 노드 중에서 첫 번째 노드의 이름을 선택함.
document.getElementById(&quot;html&quot;).innerHTML = document.childNodes[1].childNodes[0].nodeName; // HEAD
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;nodeValue&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// &quot;#heading&quot;인 요소의 첫 번째 자식 노드의 노드값을 선택함.
var headingText = document.getElementById(&quot;heading&quot;).firstChild.nodeValue;

document.getElementById(&quot;text1&quot;).innerHTML = headingText;
document.getElementById(&quot;text1&quot;).firstChild.nodeValue = headingText;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;nodeType (노드 고유의 이름을 저장하므로, 수정할 수 없는 읽기 전용 프로퍼티)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// 아이디가 &quot;heading&quot;인 요소의 첫 번째 자식 노드의 타입을 선택함.

var headingType = document.getElementById(&quot;heading&quot;).firstChild.nodeType; 

document.getElementById(&quot;head&quot;).innerHTML = headingType;           // 3
document.getElementById(&quot;document&quot;).innerHTML = document.nodeType; // 9
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;노드 → 프로퍼티 값&lt;/code&gt;&lt;br /&gt;
요소 노드(element node) → 1&lt;br /&gt;
속성 노드(attribute node) → 2&lt;br /&gt;
텍스트 노드(text node) → 3&lt;br /&gt;
주석 노드(comment node) → 8&lt;br /&gt;
문서 노드(document node) → 9&lt;/p&gt;
&lt;h2&gt;빈 텍스트 노드의 처리&lt;/h2&gt;
&lt;p&gt;현재 대부분의 주요 웹 브라우저는 모두 W3C DOM 모델을 지원하지만, 그 처리 방식에 있어 약간씩의 차이가 있다.
가장 큰 차이점은 띄어쓰기와 줄 바꿈을 처리하는 방식이다.&lt;/p&gt;&lt;p&gt;파이어폭스나 기타 브라우저들은 띄어쓰기나 줄 바꿈을 텍스트 노드(text node)로 취급한다.&lt;/p&gt;&lt;p&gt;하지만 익스플로러는 띄어쓰기나 줄 바꿈을 텍스트 노드로 취급하지 않는다.&lt;/p&gt;&lt;p&gt;따라서 자식 노드나 형제 노드를 이용하여 원하는 노드에 접근하려고 하면 브라우저 간에 차이가 발생하게 된다.&lt;br /&gt;
이 차이를 없애는 가장 손쉬운 방법은 nodeType 프로퍼티를 사용하여 선택된 요소의 타입을 검사하는 것이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var lastNode;

function findLastChild(parentNode) {

    lastNode = parentNode.lastChild;

    while (lastNode.nodeType != 1) {
        lastNode = lastNode.previousSibling;
    }

}

function printLastChild() {
    var parentNode = document.getElementById(&quot;parentNode&quot;);

    findLastChild(parentNode);
    document.getElementById(&quot;nodename&quot;).innerHTML = lastNode.nodeName;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 예제에서 마지막 자식 노드를 찾은 후에, 찾은 노드의 타입이 요소 노드가 아니면 그 앞의 노드를 다시 검사한다.&lt;br /&gt;
이 방식을 사용하면 모든 브라우저에서 마지막 자식 노드로 같은 요소 노드를 선택할 수 있게 된다.&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>childNode</category>
      <category>javascript</category>
      <category>nextSibling</category>
      <category>nodeName</category>
      <category>nodeType</category>
      <category>nodeValue</category>
      <category>parentNode</category>
      <category>previousSibling</category>
      <category>노드 접근</category>
      <author>hyejin_dev</author>
      <guid isPermaLink="true">https://hyejin-dev.tistory.com/12</guid>
      <comments>https://hyejin-dev.tistory.com/12#entry12comment</comments>
      <pubDate>Wed, 20 Mar 2019 10:12:54 +0900</pubDate>
    </item>
    <item>
      <title>ES6 Template처리 및 Taggd Template literals 알아보기</title>
      <link>https://hyejin-dev.tistory.com/11</link>
      <description>&lt;article class=&quot;markdown-body&quot;&gt;

&lt;h2&gt;Template 처리&lt;/h2&gt;
&lt;p&gt;ES6에서 문자열 처리를 보다 간편하게 할 수 있는 템플릿을 제공한다.&lt;br /&gt;
Template literal을 사용하여 거추장스러운 '&lt;strong&gt;+&lt;/strong&gt;' 이나 '&lt;strong&gt;\n&lt;/strong&gt;'을 더이상 사용하지 않아도 된다.&lt;br /&gt;
&lt;code&gt;${ }&lt;/code&gt; 안에는 &lt;strong&gt;변수&lt;/strong&gt; 또는 연산식 등의 &lt;strong&gt;표현식&lt;/strong&gt;이 들어갈 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let name = &quot;HYEJIN&quot;;
// 1 왼쪽에 있는 `
let grettingTemplate = `
    Hi, ${name}!
    Have a nice day!
`; 
console.log(grettingTemplate);
// 결과
// Hi, HYEJIN!
// Have a nice day!
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Tagged Template literals&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;간단한 기본 예제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let name = &quot;HYEJIN&quot;;
let num = &quot;010-1234-1234&quot;;
console.log(`hi, ${name}! Have a nice day! ${num} is your number`);
// 결과 : hi, HYEJIN! Have a nice day! 010-1234-1234 is your number
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;tagged template을 사용하여 text와 value로 분리할 수 있다.&lt;br /&gt;
&lt;strong&gt;text&lt;/strong&gt;는 공백 문자를 기준으로 배열의 형태로 파라미터가 들어오며,&lt;br /&gt;
${ } 안의 표현식은 &lt;strong&gt;value&lt;/strong&gt;라는 파라미터로 String type으로 들어온다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;배열관련 응용된 예제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const data = [
  {
    name: 'COFFEE',
    order: true,
    items: ['americano', ' latte']
  },
  {
    name: 'CAFE',
    order: false,
  },
  {
    name: 'HYEJIN',
    order: true,
    items: ['americano', ' milk', ' green-tea']
  }
]

function fn(tags, name, items){
//   console.log(tags);
  if(typeof items === &quot;undefined&quot;){
    items = &quot;&amp;lt;span style='color: red; margin-top: -20px;'&amp;gt;주문 가능한 상품이 없습니다.&amp;lt;/span&amp;gt;&quot;;
  }
  return (tags[0] + name + tags[1] + items + tags[2]);
}

data.forEach((valueee) =&amp;gt; {
 let template = fn`&amp;lt;h2 style='margin-top: 80px;'&amp;gt;Welcome Come  ${valueee.name} !&amp;lt;/h2&amp;gt;
  &amp;lt;h3&amp;gt;주문가능항목 : &amp;lt;span style='font-size: 14px;'&amp;gt;${valueee.items}&amp;lt;/span&amp;gt;&amp;lt;/h2&amp;gt;`;
  document.body.innerHTML += template;
});

// 결과
// Welcome Come COFFEE !
// 주문가능항목 : americano, latte
// Welcome Come CAFE !
// 주문가능항목 : 주문 가능한 상품이 없습니다.
// Welcome Come HYEJIN !
// 주문가능항목 : americano, milk, green-tea
&lt;/code&gt;&lt;/pre&gt;

&lt;/article&gt;</description>
      <category>JavaScript</category>
      <category>${v.nave}</category>
      <category>es6</category>
      <category>javascript</category>
      <category>literals</category>
      <category>taggd</category>
      <category>template</category>
      <author>hyejin_dev</author>
      <guid isPermaLink="true">https://hyejin-dev.tistory.com/11</guid>
      <comments>https://hyejin-dev.tistory.com/11#entry11comment</comments>
      <pubDate>Tue, 26 Feb 2019 11:36:35 +0900</pubDate>
    </item>
    <item>
      <title>ES6 Map &amp;amp; WeakMap / 가비지 컬렉터 알아보기</title>
      <link>https://hyejin-dev.tistory.com/10</link>
      <description>&lt;article class=&quot;markdown-body&quot;&gt;


&lt;h2&gt;Map &amp;amp; WeakMap 추가정보를 담은 객체저장하기&lt;/h2&gt;
&lt;p&gt;Array를 개선한 자료구조 : Set, WeakSet&lt;br /&gt;
Object를 개선한 자료구조 : Map, WeakMap&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Map&lt;/code&gt; : key, value 구조이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let wm = new WeakMap();
let myfun = function(){};
// 이 함수가 얼마나 실행됐지? 를 알려고 할때.

wm.set(myfun, 0);

console.log(wm);  // WeakMap&amp;nbsp;{ƒ =&amp;gt; 0}

let count = 0;
for(let i=0; i&amp;lt;10; i++){
  count = wm.get(myfun); // get value
  count++;
  wm.set(myfun, count);
}

console.log(wm);  // WeakMap&amp;nbsp;{ƒ =&amp;gt; 10}

myfun = null;
console.log(wm.get(myfun)); // undefined
console.log(wm.has(myfun));  // false
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;WeakMap 클래스 인스턴스 변수 보호하기&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;WeakMap의 키는 오직 Object형 뿐이다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;키로 원시 데이터형은 허용되지 않는다. (가령 Symbol은 WeakMap 키가 될 수 없음)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;다른 강한 키 참조가 없는 경우 모든 항목은 가비지 컬렉터에(하단 내용 참고) 의해 WeakMap에서 제거된다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;WeakMap&lt;/code&gt; : new, .has(), .get(), .set(), .delete() 만 지원&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;WeakSet&lt;/code&gt; : new, .has(), .add(), .delete() 만 지원&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WeakSet에 저장되는 &lt;strong&gt;value&lt;/strong&gt;, WeakMap에 저장되는 &lt;strong&gt;key&lt;/strong&gt;는 반드시 &lt;strong&gt;객체&lt;/strong&gt;여야 한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const wm = new WeakMap();  // 프라이빗한 변수 만들기1


function Area(width, height){
  wm.set(this, {width, height});  // 프라이빗한 변수 만들기2
}

Area.prototype.getArea = function(){
  const {width, height} = wm.get(this);
  return width * height;
}

let myarea = new Area(20,10);
console.log(myarea.getArea()); // 200
console.log(myarea.height); // undefined , 외부에서 접근 불가
myarea = null;

console.log(wm.has(myarea));  // false
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3&gt;1. 메모리의 생명주기&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[ 메모리 할당 ]&lt;br /&gt;
프로그램이 사용할 수 있도록 운영체제가 메모리를 할당하는 단계&lt;br /&gt;
저수준의 언어는 이를 개발자가 명시적으로 처리해줍니다.&lt;br /&gt;
고수준의 언어는 개발자가 이를 신경쓰지 않아도 됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[ 메모리 사용 ]&lt;br /&gt;
할당된 메모리를 실제로 프로그램이 사용하는 단계&lt;br /&gt;
개발자가 필요에 따라 읽기와 쓰기 작업을 진행합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[ 메모리 해제 ]&lt;br /&gt;
프로그램에서 필요하지 않은 메모리를 전체를 되돌려 주어 다시 사용하게 만드는 단계&lt;br /&gt;
메모리 할당 작업과 마찬 가지로 저수준은 이를 명시합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var n = 374; // 숫자에 대한 메모리 할당
var s = 'sessionstack'; // 문자에 대한 메모리 할당
var o = { a: 1, b: null }; // 객체 및 그 값에 대한 메모리 할당
var a = [1, null, 'str']; // (객체와 같음) 배열과 그 값에 대한 메모리 할당
function f(a) { return a + 3; } // 함수에 대한 할당 - 함수는 호출할 수 있는 객체
someElement.addEventListener('click', function() { // 함수 표현식 또한 객체를 할당
  someElement.style.backgroundColor = 'blue';
}, false);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;변수와 함수를 선언하고 함수의 표현식을 이용하는 것이 전부 메모리를 할당하는 과정이다.&lt;/p&gt;
&lt;h3&gt;2. 가비지 컬렉션&lt;/h3&gt;
&lt;p&gt;사용이 완료된 메모리를 정리하는 것&lt;/p&gt;
&lt;h3&gt;3. 가비지 컬렉터 (Garbage Collector)&lt;/h3&gt;
&lt;p&gt;프로그래머가 동적으로 할당한 메모리 중 더 이상 사용하지 않는 영역을 자동으로 찾아내어 해제해주는 것&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로그래밍을 하기가 훨씬 쉬워짐&lt;/li&gt;
&lt;li&gt;메모리에 관련된 버그가 발생할 확률도 낮아짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;가비지 콜렉션 알고리즘의 핵심 개념은 &lt;code&gt;참조&lt;/code&gt; 이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// 기본
function Area(height, width){
  this.height = height;
  this.width = width;
}

Area.prototype.getArea = function(){
  return this.height * this.width;
}

let myarea = new Area(10,20);
console.log(myarea.getArea());  // 200
console.log(myarea.height);  // 10
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// WeakMap 활용   
const wm2 = new WeakMap();  // 프라이빗한 변수 만들기1

function Area2(height, width){
  wm2.set(this, {width, height});  // 프라이빗한 변수 만들기2
}

Area2.prototype.getArea = function(){
  const {width, height} = wm2.get(this);
  return width * height;
}

let myarea2 = new Area2(10,20);
console.log(myarea2.getArea()); // 200
console.log(myarea2.height); // undefined , 외부에서 접근 불가
&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>es6</category>
      <category>Garbage Collector</category>
      <category>javascript</category>
      <category>map</category>
      <category>WeakMAp</category>
      <category>가비지 컬렉터</category>
      <author>hyejin_dev</author>
      <guid isPermaLink="true">https://hyejin-dev.tistory.com/10</guid>
      <comments>https://hyejin-dev.tistory.com/10#entry10comment</comments>
      <pubDate>Mon, 25 Feb 2019 16:25:02 +0900</pubDate>
    </item>
    <item>
      <title>ES6 Set &amp;amp; WeakSet 알아보기</title>
      <link>https://hyejin-dev.tistory.com/9</link>
      <description>&lt;article class=&quot;markdown-body&quot;&gt;
&lt;h2&gt;Set으로 유니크한 배열 만들기&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;set&lt;/code&gt; : 중복 없이 유일한 값을 저장하려고 할때 사용한다.&lt;/li&gt;
&lt;li&gt;이미 존재하는지 체크할 때 유용하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let mySet = new Set();
// console.log(toString.call(mySet));

mySet.add(&quot;중복&quot;);
mySet.add(&quot;hyejin&quot;);
mySet.add(&quot;중복&quot;);
mySet.add(&quot;abcd&quot;);
mySet.add(&quot;중복&quot;);

console.log(mySet.has('중복')); // true

mySet.forEach(function(v){
  console.log(v) // 중복,  hyejin, abcd
});

mySet.delete('중복');

mySet.forEach(function(v){
  console.log(v) // hyejin, abcd
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;WeakSet 으로 효과적으로 객체타입저장하기&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WeakSet&lt;/code&gt; : 참조를 가지고 있는 객체만 저장이 가능하다. (변수, 함수)&lt;/li&gt;
&lt;li&gt;객체형태를 중복없이 저장하려고 할때 유용하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let arr = [1,2,3,4];
let arr2 = [5,6,7,8];
let obj = {arr, arr2};

let ws = new WeakSet();

/* 
ws.add(arr); // 변수
ws.add(function(){}); // 함수

아래 3개는 오류 : Invalid value used in weak set
ws.add(111);  // 숫자
ws.add(&quot;111&quot;); // 문자
ws.add(null);
*/

ws.add(arr);
ws.add(arr2);
ws.add(obj);

arr = null; // 이것때문에 아래 false가 나옴

console.log(ws);
console.log(ws.has(arr)+ ', '+ws.has(arr2));  // false, true
&lt;/code&gt;&lt;/pre&gt;


&lt;/article&gt;</description>
      <category>JavaScript</category>
      <category>es6</category>
      <category>javascript</category>
      <category>set</category>
      <category>WeakSet</category>
      <category>중복</category>
      <author>hyejin_dev</author>
      <guid isPermaLink="true">https://hyejin-dev.tistory.com/9</guid>
      <comments>https://hyejin-dev.tistory.com/9#entry9comment</comments>
      <pubDate>Mon, 25 Feb 2019 14:02:12 +0900</pubDate>
    </item>
    <item>
      <title>ES6 Destructuring Array, Object, JSON, event 알아보기</title>
      <link>https://hyejin-dev.tistory.com/8</link>
      <description>&lt;article class=&quot;markdown-body&quot;&gt;
&lt;h2&gt;Destructuring Array&lt;/h2&gt;
&lt;p&gt;배열 및 객체에서 원하는 정보만을 뽑아내는 새로운 방법이다.&lt;br /&gt;
이 방법을 쓰면 index 번호를 굳이 지정하지 않아도 된다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const data = [1, 2, 3, 4];
const [d1, d2, d3] = data; // 할당 연산자 왼쪽에 배열 형태의 변수 리스트가 필요하다.  
console.log(d1, d2, d3); // 1 2 3
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[선언할변수명, …]&lt;/code&gt; 처럼 배열 인덱스 대신 배열 인덱스에 해당하는 위치에 변수명을 넣어서 사용&lt;/li&gt;
&lt;li&gt;왼쪽의 &lt;strong&gt;변수 리스트&lt;/strong&gt;와 오른쪽의 &lt;strong&gt;배열&lt;/strong&gt;은 &lt;strong&gt;배열의 인덱스를 기준&lt;/strong&gt;으로 할당된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const today = new Date();
const formattedDate = today.toISOString().substring(0, 10);
const [year, month, day] = formattedDate.split('-');
console.log([year, month, day]); // [ '2019', '02', '25' ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;배열에서 필요한 요소만 추출하여 변수에 할당하고 싶은 경우에 유용하다&lt;/p&gt;
&lt;h2&gt;Destructuring Object&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let obj = {
    name: 'hyejin',
    address: 'Korea',
    age: 10
}

let {name, age} = obj;
console.log(name, age); // 결과 hyejin, 10

// 변수명 다르게 줄때
let {name: myName, age: myAge} = obj;
console.log(myName, myAge); // 결과 hyejin, 10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;let {프로퍼티명, …} = 객체&lt;/code&gt; : 각각의 프로퍼티가 변수로 추출된다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;{프로퍼티명:지정할변수명, …}&lt;/code&gt; : 변수명 다르게 줄때&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const todos = [
  { id: 1, content: 'HTML', completed: true },
  { id: 2, content: 'CSS', completed: false },
  { id: 3, content: 'JS', completed: false }
];

// todos 배열의 요소인 객체로부터 completed 프로퍼티만을 추출한다.
const completedTodos = todos.filter(({ completed }) =&amp;gt; completed);


console.log(completedTodos); 
// 결과 [ { id: 1, content: 'HTML', completed: true } ]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Destructuring 활용 JSON파싱&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let jsonData = [
  {
    title: &quot;첫 번째 입니다&quot;,
    author: &quot;1. Hyejin&quot;,
    category: { aaa : &quot;1. Javascript&quot;}, // 중첩 객체
    publishDate: &quot;2019-02-25&quot;
  }
  ,{
    title: &quot;두 번째 입니다.&quot;,
    author: &quot;2. Hyejin&quot;,
    category: { aaa : &quot;2. Javascript&quot;}, // 중첩 객체
    publishDate: &quot;2019-02-26&quot;
  }
]

let [{title: aTitle, author: aAuthor}] = jsonData
console.log(aTitle, aAuthor); // 첫 번째 입니다 , 1. Hyejin

let [, {title: bTitle, author: bAuthor}] = jsonData
console.log(bTitle, bAuthor); // 두 번째 입니다 , 2. Hyejin


// 중첩 객체의 경우 : 2개 모두 불러올 경우
const [p1, p2] = jsonData;
console.log(p1.category.aaa+ ', ' + p2.category.aaa); 
//1. Javascript, 2. Javascript
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Destructuring 활용 _Event객체전달&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;div&amp;gt;JavaScript&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;document.querySelector(&quot;div&quot;).addEventListener(&quot;click&quot;, function({type, target}){
  console.log(type+ ', '+target.tagName);
}); // 결과 click, DIV
&lt;/code&gt;&lt;/pre&gt;
&lt;/article&gt;</description>
      <category>JavaScript</category>
      <category>array</category>
      <category>D</category>
      <category>Destructuring</category>
      <category>es6</category>
      <category>Event</category>
      <category>javascript</category>
      <category>json</category>
      <category>object</category>
      <author>hyejin_dev</author>
      <guid isPermaLink="true">https://hyejin-dev.tistory.com/8</guid>
      <comments>https://hyejin-dev.tistory.com/8#entry8comment</comments>
      <pubDate>Mon, 25 Feb 2019 13:24:49 +0900</pubDate>
    </item>
  </channel>
</rss>