<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ginger.log</title>
        <link>https://velog.io/</link>
        <description>Slow but steady</description>
        <lastBuildDate>Sat, 21 Aug 2021 09:14:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ginger.log</title>
            <url>https://images.velog.io/images/lemon-ginger/profile/a25f9ea5-9db8-43e6-b121-6aa72aa96967/cat.JPG</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ginger.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lemon-ginger" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[js 에서 console.log 활용]]></title>
            <link>https://velog.io/@lemon-ginger/js-%EC%97%90%EC%84%9C-console.log-%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@lemon-ginger/js-%EC%97%90%EC%84%9C-console.log-%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Sat, 21 Aug 2021 09:14:56 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-js">const dog = {type:&#39;🐶&#39;, name:&#39;jelly&#39;, owner:{name:&#39;ellie&#39;}}
//log level
console.log(&#39;log&#39;); // 개발단계에서 사용 - 출력 (성능에 영향을 줌.)
console.info(&#39;info&#39;); // 특정 정보 출력 
// log,info는 배포 단계에서는 삭제 되어야함 
console.lwarn(&#39;warn&#39;); // 경보
console.error(&#39;error&#39;); // 에러(시스템에러,예상하지못한 에러)

// assert
console.assert(2===3, &#39;not same!&#39;);
// 조건이 거짓일때만 출력됨
console.assert(2===2,&#39;same&#39;);
// 동일한 경우에는 출력이 되지 않음.

//print object
console.table(dog);
console.dir(dog,{colors:false,depth:1});
//기존 컬러를 false, 깊이는 object의 depth를 1레벨까지

// measuring time
console.time(&#39;for loop&#39;);
for (let i =0 ; i&lt;10; i++){
    i++;
}

console.timeEnd(&#39;for loop&#39;);

// time(&#39;name&#39;) =&gt; timeEnd(&#39;name&#39;);
// 걸린 시간을 측정해준다.

// counting

function a() {
    console.count(&#39;a function);
}
  a ();
  a();
  a();

console.count
console.countReset 
  //count 초기화


 console.trace ();
 //호출 위치를 trace할 수 있다.
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[css추가된 기능]]></title>
            <link>https://velog.io/@lemon-ginger/css%EC%B6%94%EA%B0%80%EB%90%9C-%EA%B8%B0%EB%8A%A5</link>
            <guid>https://velog.io/@lemon-ginger/css%EC%B6%94%EA%B0%80%EB%90%9C-%EA%B8%B0%EB%8A%A5</guid>
            <pubDate>Sat, 21 Aug 2021 08:04:54 GMT</pubDate>
            <description><![CDATA[<h1 id="1-supports">1. @supports</h1>
<h1 id="2-snap-scroll">2. Snap Scroll</h1>
<pre><code class="language-html">    &lt;h3&gt;Scroll down&lt;/h3&gt;
    &lt;div id=&quot;container&quot;&gt;
      &lt;div class=&quot;item&quot;&gt;1&lt;/div&gt;
      &lt;div class=&quot;item&quot;&gt;2&lt;/div&gt;
      &lt;div class=&quot;item&quot;&gt;3&lt;/div&gt;
      &lt;div class=&quot;item&quot;&gt;4&lt;/div&gt;
      &lt;div class=&quot;item&quot;&gt;5&lt;/div&gt;
      &lt;div class=&quot;item&quot;&gt;6&lt;/div&gt;
      &lt;div class=&quot;item&quot;&gt;7&lt;/div&gt;
      &lt;div class=&quot;item&quot;&gt;8&lt;/div&gt;
    &lt;/div&gt;</code></pre>
<pre><code class="language-css">#container {
  width: 500px;
  height: 500px;
  border: 1px solid blue;
  overflow: scroll;
  **/* Add this to the parent */
  scroll-snap-type: y mandatory;**
}
.item {
  /* Add this to the child */
  scroll-snap-align: center;
  display: inline-block;
  width: 100%;
  height: 100%;
  display: flex;
  font-size: 18px;
  align-items: center;
  **justify-content: center;
  border: 1px solid red;**
}
</code></pre>
<h1 id="3-is-pseudo-selector">3. is Pseudo Selector</h1>
<pre><code>header button,
nav button,
form button {
    background-color: red;
}

에서 :is 를 사용한다면

:is(header,nav,form) button {
    background-color: red;
}

만약 요소가 header거나, nav거나, form 이면
button을 선택하고 배경색은 red로 변경한다</code></pre><h1 id="4-flex-box-gap">4. flex box gap</h1>
<p>flex container에 gap property를 지정해주면 됨
(예전엔 margin을 사용했음.)</p>
<pre><code class="language-css">div{
    display: flex;
    gap: 10px 5px;
    /*10px은 row-gap , 5px은 column-gap*/
}</code></pre>
<h1 id="5-aspect-ratio">5. aspect ratio</h1>
<p>웹사이트에서 이미지나 영상을 정해진 비율을 유지할때 유용.</p>
<pre><code>igm{
    aspect-ratio : 16/9;
}
</code></pre><h1 id="6-position-sticky">6. position: sticky</h1>
<p>원하는 요소에 position: sticky를 지정해주고
정의된 높이가 있는 컨테이너 안에 요소를 넣어주면 됨.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[array , set]]></title>
            <link>https://velog.io/@lemon-ginger/array-set</link>
            <guid>https://velog.io/@lemon-ginger/array-set</guid>
            <pubDate>Sun, 15 Aug 2021 05:15:09 GMT</pubDate>
            <description><![CDATA[<h2 id="array--중복을-허용하는-자료구조">array : 중복을 허용하는 자료구조</h2>
<h2 id="set--중복을-허용하지-않는-자료구조">set : 중복을 허용하지 않는 자료구조</h2>
<pre><code>const array = [&quot;🐱&quot;,&quot;🐶&quot;,🐰&quot;,🦊&quot;,&quot;🐱&quot;,&quot;🦊&quot;];
//중복을 제거한 새로운 배열을 만들때
// array는 중복을 허용하는 자료구조 이므로
// set (중복을 허용하지 않는 자료구조)을 이용한다.
const newarray = [...new Set(array)];
console.log(newarray);</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[optional chaining]]></title>
            <link>https://velog.io/@lemon-ginger/optional-chaining</link>
            <guid>https://velog.io/@lemon-ginger/optional-chaining</guid>
            <pubDate>Sat, 14 Aug 2021 10:13:33 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-js">//Optional CHaining
const bob = {
    name: &#39;Julia&#39;,
      age: 20,
}

const anna = {
    name:&#39;Julia&#39;,
      age:20,
      job:{
        title:&#39;software engineer&#39;
    }
}

//Bad 
//job이 있을수도 있고 없을수도 있고, 타이틀을 보여줘야한다
functioin displayJobTitle (person){
    if(person.job &amp;&amp; person.job.title) {
        console.log(person.job.title);
    }
}

// Good
function displayJobTitle (person){
    if(person.job?.title){
         console.log(person.job.title);  
     }
}

// optional chaining , nullish 
function displayJobTitle(person){
    const title = person.job?.title ?? &#39;No Job yet&#39;;
    console.log(title);
}

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[spread-syntax-object]]></title>
            <link>https://velog.io/@lemon-ginger/spread-syntax-object</link>
            <guid>https://velog.io/@lemon-ginger/spread-syntax-object</guid>
            <pubDate>Sat, 14 Aug 2021 09:58:16 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-js">const item = {type: &#39;👕&#39;,size:&#39;M&#39;};
const detail = {price:20, made:&#39;Korea&#39;};

// Bad
const newObject = new Object();
newObject[&#39;type&#39;] = item.type;
newObject[&#39;size&#39;] = item.size;
newObject[&#39;price&#39;] = detail.price;
newObject[&#39;made&#39;] = detail.made;
mewObject[&#39;gender&#39;] = detail.gender;

//Bad
const newObject2 = {

    type: item.type,
    size: item.size,
      price : detail.price,
      made : detail.made,
      gender: detail.gender,
};

//Good
const shirt0 = Object.assign (item,detail);

//Good - spread syntax objec
const shirt = {...item,...detail}:
//{}로 새로운 object를 만들고 ...으로 하나씩 가져와준다.
//좋은점은 뒤에 바꾸고 싶은 값만 업데이트 해줄수 있다는것
// 이런식으로 {...item,...detail,price:40}} 기존의 값은 가져오되 pric만 바꿔줄 수 있다.

// spread syntax - array

let fruits = [&#39;🍓&#39;,&#39;🍉&#39;,&#39;🍐&#39;];
//fruits.push(&#39;🍊&#39;); 기존의 배열을 변경시킴.
//새로운 배열을 만들고 싶다면? spread syntax이용한다.
fruits = [...fruits,&#39;🍊&#39;]; // push와동일
fruits = [&#39;🍇&#39;,...fruits]; // unshift와 동일


const fruits2 = [&#39;🍈&#39;,&#39;🍍&#39;];
let combined = fruits.concat.fruits2;
combined = [...fruits,&#39;🍒&#39;...fruits2];

</code></pre>
<h5 id="출처httpsdevelopermozillaorgkodocswebjavascriptreferenceglobal_objectsobjectassign">출처:<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/assign">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/assign</a></h5>
]]></description>
        </item>
        <item>
            <title><![CDATA[Nullish-coalescing operator]]></title>
            <link>https://velog.io/@lemon-ginger/Nullish-coalescing-operator</link>
            <guid>https://velog.io/@lemon-ginger/Nullish-coalescing-operator</guid>
            <pubDate>Sat, 14 Aug 2021 09:30:59 GMT</pubDate>
            <description><![CDATA[<h1 id="nullish-coalescing-operator-">Nullish coalescing operator ??</h1>
<h2 id="leftexpr--rightexpr">leftExpr ?? rightExpr</h2>
<h2 id="null-undefined--rightexpr-실행">null, undefined ?? rightExpr 실행</h2>
<h4 id="✦-default-parameter-is-only-for-undefined">✦ Default Parameter is only for undefined!</h4>
<hr>
<h1 id="logical-or-operator-">Logical Or operator ||</h1>
<h2 id="leftexpr--rightexpr-1">leftExpr || rightExpr</h2>
<h2 id="falsy--rightexpr-실행">falsy || rightExpr 실행</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[for ... of  / for...in]]></title>
            <link>https://velog.io/@lemon-ginger/for-...-of-for...in</link>
            <guid>https://velog.io/@lemon-ginger/for-...-of-for...in</guid>
            <pubDate>Sat, 03 Jul 2021 08:48:50 GMT</pubDate>
            <description><![CDATA[<h5 id="출처httpsdevelopermozillaorgkodocswebjavascriptreferencestatementsforof">출처:<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for...of">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for...of</a></h5>
<h2 id="for--of">for ... of</h2>
<p>for of / for in 차이를 아라보자..!
🤣</p>
<hr>
<p>반복가능한 객체 Array, Map, Set, String , arguments객체등을 포함
개별 속성값에 대해 실행되는 문이 있는
<strong>사용자 정의 반복 후크를 호출하는 루프</strong>를 생성한다.</p>
<pre><code>const array1 = [&#39;a&#39;,&#39;b&#39;,&#39;c&#39;];
for (const element of array1) {
    console.log(element);
}</code></pre><h2 id="for--in">for ... in</h2>
<p><strong>키가 지정된</strong> 모든 열거 가능한 속성에 대해 반복함.</p>
<pre><code>const object = {a:1, b:2, c:3};
for(const property in object){
    console.log(property);
}

//a
//b
//c
//출력</code></pre><p>이제 외워...! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React-Redux Process정리]]></title>
            <link>https://velog.io/@lemon-ginger/React-Redux-Process%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@lemon-ginger/React-Redux-Process%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 06 Jun 2021 06:02:57 GMT</pubDate>
            <description><![CDATA[<h5 id="출처-httpsvelogiojeffyounreact-redux-ed9484eba19cec84b8ec8aa4-eca095eba6ac">출처: <a href="https://velog.io/@jeffyoun/React-Redux-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%A0%95%EB%A6%AC">https://velog.io/@jeffyoun/React-Redux-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%A0%95%EB%A6%AC</a></h5>
<h3 id="reducer함수-만들기">Reducer함수 만들기</h3>
<p><code>State</code>와 정의한 <code>Action Type</code>으로 <code>Reducer함수</code>를 만들면 된다.
이때 Reducer는 꼭 순수 함수로 만들어야 한다.
아래 4가지 조건을 만족하면 된다.</p>
<ol>
<li>Reducer함수는 이전상태와 액션객체를 파라미터로 받는다.</li>
<li>파라미터 값 외에는 의존하면 안된다.</li>
<li>이전 상태는 절대 건들이지 않고, 변화를 준 새로운 상태 객체를 만들어 반환한다.</li>
<li>똑같은 파라미터로 호출된 리듀서 함수는 언제나 똑같은 결과 값을 반환해야한다.</li>
</ol>
<pre><code class="language-javascript">function counter(state = initialState, action) {
  switch (action.type) {
    case INCREASE : 
      return {
          number: state.number +1
      };
    case DECREASE : 
      return {
          number: state.number -1 
      };
    default : 
      return state;
  }

}
export default counter;
</code></pre>
<p>Action type에 따라 state를 변형한 <code>새로운 state를 반환</code>해주면 된다.
절대로 기존 <code>state</code>를 <strong>수정해서는 안됨</strong>.</p>
<p>createAction메소드를 사용해 action타입을 반환하는 함수를 만들어준다.</p>
<pre><code class="language-javascript">export const increase = createAction(INCREASE);
export const decrease = createAction(DECREASE);
//만약 파라미터를 전달해줘야 한다면 payload를 사용하면 됨.
export const changeInput = createAction(CHANGE_INPUT, input =&gt; input);</code></pre>
<p>코드가 길어질때
<code>redux-actions</code>라이브러리를 사용해 switch-case에서 벗어 날 수 있다.</p>
<pre><code class="language-javascript">const counter = handleActions (
  {
      [INCREASE] : (state,action) =&gt; (
      {
          number:state.number +1
      }
    ),
    [DECREASE] : (state,action)=&gt;(
      {
        number: state.number -1
      }
    ),
    initialState

  }

);</code></pre>
<p>createAction에서 payload를 넣어줬다면?</p>
<pre><code class="language-javascript">const counter = handleActions (
  {
      [INCREASE] : (state,action) =&gt; (
      {
          number:state.number +1
      }
    ),
    [DECREASE] : (state,action)=&gt;(
      {
        number: state.number -1
      }
    ),

    [CHANGE_INPUT] : (state,action) =&gt; (
      {
          ...state,
        input : action.payload
      }
    )

    initialState

  }

);

</code></pre>
<p>위와 같이 작성하면 payload에 어떤 값을 넣었는지 헷갈리므로</p>
<pre><code class="language-javascript">handleActions (
  {
      [CHANGE_INPUT] : (state,{payload:input})=&gt;(
      {
          ...state,
        input: input
      }
    )
  },
  initialState

);</code></pre>
<p>이런식으로 작성하면 가독성이 좋아진다.</p>
<p>ReduxStore에는 하나의 Reducer만 연결되어야 하므로 reducer를 통합해야한다.
redux는 <code>combineReducers</code> 라는 함수를 사용한다.</p>
<pre><code class="language-javascript">import {combineReducers} from &#39;redux&#39;;
import counter from &#39;./counter&#39;;

const rootReducer = combineReducers({
    counter
});

export default rootReducer;</code></pre>
<p>combineReducers메소드 안에 <strong>객체 형태</strong>로 우리가 만든 Reducer를 넣어주면 됨.</p>
<pre><code class="language-javascript">const rootReducer = combineReducers ({
    counter1,
      counter2,
      counter3
});
</code></pre>
<hr>
<h3 id="hook을-이용해-redux이용하기">Hook을 이용해 Redux이용하기</h3>
<h4 id="useselector사용">useSelector사용</h4>
<p><code>useSelector</code>를 이용하면 <code>connect</code> 함수 없이 redux를 조회할 수 있다.</p>
<pre><code class="language-javascript">const result = useSelector(상태 선택 함수);</code></pre>
<pre><code class="language-javascript">import {useSelector} from &#39;react-redux&#39;;
const CounterContainer = ()=&gt;{
    const counterNum = useSelector(state=&gt; state.counter.number)
    return (
        &lt;Counter number = {counterNume}/&gt;
    );
};</code></pre>
<h4 id="usedispatch를-사용해서-action-dispatch하기">useDispatch를 사용해서 action dispatch하기</h4>
<pre><code class="language-javascript">const dispatch = useDispatch();</code></pre>
<p>를 이용해 dispatch를 얻은 후에 modules에서 얻은 함수를 넣어준다.</p>
<pre><code class="language-javascript">import {useSelector} from &#39;react-redux&#39;;
const CounterContainer = ()=&gt;{
    const counterNum = useSelector(state=&gt; state.counter.number);
    const dispatch = useDispatch();
    return (
        &lt;Counter 
              number = {counterNume}
            onIncrease = {()=&gt;dispatch(increase())}
            onDecrease = {()}
        /&gt;
    );
};</code></pre>
<p>이렇게 작성하면 숫자가 바뀔때마다 컴포넌트가 리렌더링 됨
-&gt; 매번 함수를 새로 만드므로 useCallback으로 감싸준다.</p>
<pre><code class="language-javascript">import React, {useCallback} from &#39;react&#39;;
const CounterContainer = () =&gt; {
    const CounterNum = useSelector(state=&gt;state.counter.number);
      const dispatch = useDispatch();
      const onIncrease = useCallback(()=&gt;dispatch(increase(),[dispatch]));
      const onDecrease = useCallback(()=&gt;dispatch(decrease(),[dispatch]));

  return (
      &lt;Counter
        number = {counterNum}
        onIncrese = {onIncrease}
        onDerease = {onDecrease}
    /&gt;
  );

};
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Redux 를 쓰는 이유]]></title>
            <link>https://velog.io/@lemon-ginger/Redux-%EB%A5%BC-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@lemon-ginger/Redux-%EB%A5%BC-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Sun, 06 Jun 2021 05:05:50 GMT</pubDate>
            <description><![CDATA[<h5 id="참고-httpsvelopertcom3533">참고: <a href="https://velopert.com/3533">https://velopert.com/3533</a></h5>
<h3 id="1-하나의-애플리케이션-안에는-하나의-스토어가-있다">1. 하나의 애플리케이션 안에는 하나의 스토어가 있다.</h3>
<h3 id="2-읽기전용-상태이다">2. 읽기전용 상태이다.</h3>
<p>리액트에서
<code>state업데이트</code>를 할때는-&gt; <code>setState 를 사용</code>한다
<code>배열을 업데이트</code> 할때는 -&gt; 배열자체에 push하지 않고, <code>concat 함수를 사용</code>해 기존의 배열을 수정하지 않고, <code>새로운 배열을 만들어 교체해 업데이트</code> 한다.
리덕스에서 불변성을 유지하는 이유는 내부적으로 데이터가 변경되는것을 감지 하기 위해
<strong>shallow equality</strong>를 검사하기 때문이다.</p>
<h3 id="3-변화를-일으키는-함수-리듀서는-순수한-함수여야-한다">3. 변화를 일으키는 함수 (===리듀서)는 순수한 함수여야 한다.</h3>
<p>리듀서는 <strong>이전 상태, 액션객체를 파라미터</strong>로 받는다.
<strong>이전의 상태는 절대 건들이지 않는다.</strong> 
변화를 일으킨 새로운 상태 객체를 반환한다.
<strong>똑같은 파라미터로 호출된 리듀서 함수</strong>는 <strong>언제나 똑같은 결과값을 반환</strong>한다.</p>
<p>만약 실행할때마다 다른 결과값이 나타야 한다면(순수하지 않은 작업) 리덕스 미들웨어를 사용한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Axios란 ?]]></title>
            <link>https://velog.io/@lemon-ginger/Axios%EB%9E%80</link>
            <guid>https://velog.io/@lemon-ginger/Axios%EB%9E%80</guid>
            <pubDate>Sat, 22 May 2021 09:45:35 GMT</pubDate>
            <description><![CDATA[<p>출처: <a href="https://velog.io/@zofqofhtltm8015/Axios-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%84%9C%EB%B2%84-%ED%86%B5%EC%8B%A0-%ED%95%B4%EB%B3%B4%EA%B8%B0">https://velog.io/@zofqofhtltm8015/Axios-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%84%9C%EB%B2%84-%ED%86%B5%EC%8B%A0-%ED%95%B4%EB%B3%B4%EA%B8%B0</a></p>
<h3 id="axios는">Axios는?</h3>
<ul>
<li>Node.js,브라우저를 위한 Promise API를 활용하는 HTTP비동기 통신 library</li>
<li>백엔드-프론트엔드 통신을 위한 library</li>
</ul>
<p>HTTP:<a href="https://developer.mozilla.org/ko/docs/Web/HTTP">https://developer.mozilla.org/ko/docs/Web/HTTP</a></p>
<h3 id="1-axios다운로드">1. Axios다운로드</h3>
<pre><code>yarn add axios</code></pre><h3 id="2-http-methods">2. HTTP Methods</h3>
<p>클라이언트가 웹서버에게 사용자에게 요청하는 방법</p>
<h4 id="get--입력한-url에-자원-요청">GET : 입력한 url에 자원 요청.</h4>
<pre><code>axios.get(url,[,config])</code></pre><h4 id="post--새로운-리소스-생성-create할-때-사용">POST : 새로운 리소스 생성 (create)할 때 사용.</h4>
<pre><code>    axios.post(&#39;url주소&#39;,{
                data객체
               },[,config]
              )
</code></pre><h4 id="delete--rest-api에서-db에-저장된-내용을-삭제">DELETE : REST API에서 db에 저장된 내용을 삭제.</h4>
<pre><code>    axios.delete(url,[,config]);</code></pre><h4 id="put--rest-api에서-db에-저장된-내용을-갱신">PUT : REST API에서 db에 저장된 내용을 갱신.</h4>
<pre><code>    axios.put(url[,data[,config]])</code></pre><h3 id="3-axios-서버-통신">3. Axios 서버 통신</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[React.memo , useMemo , useCallback 으로 최적화 시키기]]></title>
            <link>https://velog.io/@lemon-ginger/React.memo-useMemo-useCallback-%EC%9C%BC%EB%A1%9C-%EC%B5%9C%EC%A0%81%ED%99%94-%EC%8B%9C%ED%82%A4%EA%B8%B0</link>
            <guid>https://velog.io/@lemon-ginger/React.memo-useMemo-useCallback-%EC%9C%BC%EB%A1%9C-%EC%B5%9C%EC%A0%81%ED%99%94-%EC%8B%9C%ED%82%A4%EA%B8%B0</guid>
            <pubDate>Sat, 22 May 2021 09:20:02 GMT</pubDate>
            <description><![CDATA[<p>출처:<a href="https://ssangq.netlify.app/posts/react-memo-useMemo-useCallback">https://ssangq.netlify.app/posts/react-memo-useMemo-useCallback</a>
를 보고 정리 해 봄!</p>
<h3 id="memoization">Memoization</h3>
<p>: <strong>이전 값을 메모리에 저장</strong>해 동일한 <strong>계산의 반복을 제거</strong>해 <strong>빠른 처리를 가능하게 하는 기술</strong></p>
<p><em>useMemo, useCallback, React.memo</em> 는 Memoization을 기반으로 작동한다. </p>
<h2 id="reactmemo--component의-결과값을-memoized함">React.memo : component의 결과값을 memoized함.</h2>
<p>일반적으로 함수를 직접 감싸서 사용하기도 한다.</p>
<pre><code>const Welcome = ({name}) =&gt; {

    return &lt;h1&gt; Hello {name} &lt;/h1&gt;;

};

export default React.memo(Welcome);
</code></pre><p>Welcome의 결과를 Memoization해서 이후 props가 변경될때까지 현재 memoized된
내용을 그대로 사용해 리렌더링을 막는다.</p>
<p>React.memo가 props를 비교할때 얕은 비교를 진행한다.
얕은 비교 : 원시값일때 -&gt; 같은값을 갖는지 확인/ 객체,배열 일때 -&gt; 같은 참조값,같은주소값을 갖는지 확인.</p>
<p>React.memo메서드는
<code>React.memo(component,compFunc)</code>이 기본형태이다.
<code>compFunc</code>는 수동으로 비교방식을 수정할 수 있다.</p>
<h4 id="reactmemo는-언제-사용할까">React.memo는 언제 사용할까?</h4>
<p>무조건적인 사용은 지양한다.
최적화를 위한 연산이 불필요한 경우에는 비용만 발생시킨다.</p>
<p>React.memo는 아래의 상황에서 사용을 권장한다.</p>
<ol>
<li>Pure Functional Component에서</li>
<li>Rendering이 자주 일어날 경우</li>
<li>re-rendering이 되는 동안 계속 같은 props값이 전달 될 경우</li>
<li>UI element의 양이 많은 컴포넌트의 경우</li>
</ol>
<p>일반적으로 불필요한 Render가 많이 발생하는 곳에서 사용해라</p>
<h4 id="reactmemo를-사용하지-말아야할-경우">React.memo를 사용하지 말아야할 경우</h4>
<p><strong>class기반</strong>의 컴포넌트를 <strong>래핑하는것은 적절하지 않다.</strong>
이 경우 memoizatioin을 해야한다면
<code>PureComponent</code>를 확장해 사용하거나
<code>shouldComponentUpdate()</code>를 사용하길 권장.</p>
<h2 id="usememo--함수의-결과값을-memoized함">useMemo : 함수의 결과값을 memoized함.</h2>
<p>: 메모리제이션된 값을 반환한다</p>
<p><code>useMemo</code>는 함수 호출 이후의 return값이 memoized된다.
두번째 파라미터인 배열의 요소가 변경될때 마다 첫번째 파라미터의 callback함수를 다시 생성하는 방식이다.</p>
<h2 id="usecallback--함수를-memoized함">useCallback : 함수를 memoized함.</h2>
<p>:메모리제이션된 함수를 반환한다</p>
<pre><code class="language-javascript">const handleChange = useCallback(
    (e) =&gt; {setNum(e.target.value)
   }, [] 
) ;</code></pre>
<p>useCallback을 통해 memoized된 함수는 eventhandler로 사용되며 
두번째 인자인 [] &lt;- 배열인 요소가 변경될때마다 새로운 함수가 생성된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React useCallback - 함수 재사용 ]]></title>
            <link>https://velog.io/@lemon-ginger/React-useCallback-%ED%95%A8%EC%88%98-%EC%9E%AC%EC%82%AC%EC%9A%A9</link>
            <guid>https://velog.io/@lemon-ginger/React-useCallback-%ED%95%A8%EC%88%98-%EC%9E%AC%EC%82%AC%EC%9A%A9</guid>
            <pubDate>Sat, 22 May 2021 07:40:55 GMT</pubDate>
            <description><![CDATA[<p>useCallback을 공부해봅시당!</p>
<h2 id="usecallback---usememo와-비슷한-hook">useCallback - useMemo와 비슷한 hook</h2>
<ul>
<li>useMemo : 특정 결과값을 재사용할때 사용</li>
<li>useCallback : 특정 함수를 새로 만들지 않고 재사용할때 사용.</li>
</ul>
<h2 id="usecallback을-사용해-함수-재사용">useCallback을 사용해 함수 재사용</h2>
<p>출처:<a href="https://react.vlpt.us/basic/18-useCallback.html">https://react.vlpt.us/basic/18-useCallback.html</a>
을 읽고 정리함.</p>
<pre><code class="language-javascript">const onCreate = ()=&gt;{
    const user = {

    }
};

const onRemove = id =&gt; {

};

const onToggle = id =&gt;{

};</code></pre>
<p>위의 함수들은 컴포넌트가 리렌더링 될떄마다 새로 만들어진다.
한번 만든 함수를 재사용하는 것은 중요하다.</p>
<pre><code class="language-javascript">const onChange = useCallback(
    e=&gt;{

    }
);

const onCreate = useCallback(()=&gt;{

});

const onRemove = useCallback (

);
</code></pre>
<p>**
함수 안에서 사용하는 상태 <code>props</code>가 있다면 꼭, deps 배열안에 포함시켜야한다.**</p>
<p><code>useCallback</code>은 <code>useMemo</code>를 기반으로 만들어짐</p>
<pre><code>const onToggle = useMemo(
    ()=&gt; ()=&gt; { /* */},[users]
);</code></pre><p>useCallback은 컴포넌트 렌더링 최적화 작업을 해줘야 성능이 최적화됨
-&gt; 어떤 컴포넌트가 렌더링 되는지 확인하기 위해서
-&gt; React DevTools 를 사용한다.
-&gt; &#39;highlight Updates&#39;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[mac Terminal 명령어 정리]]></title>
            <link>https://velog.io/@lemon-ginger/mac-Terminal-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@lemon-ginger/mac-Terminal-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 13 May 2021 06:54:36 GMT</pubDate>
            <description><![CDATA[<p>현재 나는 iterm을 쓰고 있다.
기본적인 명령어 몇개만 알아서
읽어보면서 정리해봐야겠다🤧</p>
<h2 id="basic">basic</h2>
<ul>
<li>cd : change directory <code>cd/경로명</code></li>
<li>cd .. : 상위디렉토리로 보냄</li>
<li>pwd : 현재 경로 표시</li>
<li>ls : 조건 검색어 <code>ls 검색어</code> 검색어를 포함한 모든 파일 표시</li>
<li>cp : 원본 복사 <code>cp web /bin</code> web폴더를 /bin에 복사.</li>
<li>mv : 원본 이동 <code>mv web /bin</code> webv폴더를 /bin에 이동.</li>
<li>mkdir : 폴더 생성 <code>mkdir web</code> web폴더를 현재 경로에 생성.</li>
<li>rmdir : 폴더 삭제 <code>mkdir web</code> web폴더를 현재 경로에서 삭제.</li>
</ul>
<h2 id="ls-option">ls option</h2>
<ul>
<li>-a : 모든 파일 표시</li>
<li>-t : 시간 순 정렬</li>
</ul>
<h2 id="cp-option">cp option</h2>
<ul>
<li>-a : 파일 , dir 뿐만 아닌 권한정보 등 속성을 모두 복사</li>
</ul>
<h6 id="참고httpskim-daeyonggithubio2019-01-04-eba7a5-ed84b0ebafb8eb8490-ebaa85eba0b9ec96b4">참고:<a href="https://kim-daeyong.github.io/2019-01-04-%EB%A7%A5-%ED%84%B0%EB%AF%B8%EB%84%90-%EB%AA%85%EB%A0%B9%EC%96%B4/">https://kim-daeyong.github.io/2019-01-04-%EB%A7%A5-%ED%84%B0%EB%AF%B8%EB%84%90-%EB%AA%85%EB%A0%B9%EC%96%B4/</a></h6>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹의 탄생,HTTP,REST등]]></title>
            <link>https://velog.io/@lemon-ginger/%EC%9B%B9%EC%9D%98-%ED%83%84%EC%83%9DHTTPREST%EB%93%B1</link>
            <guid>https://velog.io/@lemon-ginger/%EC%9B%B9%EC%9D%98-%ED%83%84%EC%83%9DHTTPREST%EB%93%B1</guid>
            <pubDate>Fri, 07 May 2021 04:50:01 GMT</pubDate>
            <description><![CDATA[<p>한 번 읽어보았다.</p>
<p><a href="https://www.slideshare.net/guruguru/ss-14241987">https://www.slideshare.net/guruguru/ss-14241987</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[03. frontend 질문 정리]]></title>
            <link>https://velog.io/@lemon-ginger/03.-frontend-%EC%A7%88%EB%AC%B8-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@lemon-ginger/03.-frontend-%EC%A7%88%EB%AC%B8-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 29 Apr 2021 06:15:10 GMT</pubDate>
            <description><![CDATA[<h1 id="🖤🖤🖤🖤🖤">🖤🖤🖤🖤🖤</h1>
<h2 id="1브라우저-렌더링-원리">1.브라우저 렌더링 원리</h2>
<h3 id="1-1사용자에게-보이는-순서">1-1.사용자에게 보이는 순서.</h3>
<h2 id="2-호이스팅이란">2. 호이스팅이란?</h2>
<h2 id="3-클로저clouser란">3. 클로저(Clouser)란?</h2>
<h2 id="4-getpost의-차이점과-사용용도">4. GET,POST의 차이점과 사용용도</h2>
<h1 id="🖤🖤🖤🖤">🖤🖤🖤🖤</h1>
<h2 id="1-this란">1. this란?</h2>
<h3 id="1-1-this용법">1-1. this용법</h3>
<h2 id="2-브라우저-저장소들의-차이점-localstorage-sessionstoragecookie">2. 브라우저 저장소들의 차이점 (localStorage, sessionStorage,Cookie)</h2>
<h2 id="3-restfulapi란">3. RestfulAPI란?</h2>
<h3 id="3-1-restfulapi의-getputpatchdelete등-설명">3-1. RestfulAPI의 GET,PUT,PATCH,DELETE등 설명</h3>
<h2 id="4-javascript의-특징">4. javaScript의 특징</h2>
<h3 id="4-1-js를-멀티스레드처럼-사용하는-이유는">4-1. js를 멀티스레드처럼 사용하는 이유는?</h3>
<h3 id="4-2-비동기적언어를-동기적으로-사용하는-방법은">4-2. 비동기적언어를 동기적으로 사용하는 방법은?</h3>
<h2 id="5event-loop란">5.Event Loop란?</h2>
<h2 id="6-event-bubbling에-대해-설명하시오">6. Event Bubbling에 대해 설명하시오</h2>
<h3 id="6-1-event-bubbling-은-child-parent-인데-반대로-구현하는-방법은">6-1. event bubbling 은 child-&gt;parent 인데 반대로 구현하는 방법은?</h3>
<h3 id="6-2-event-bubbling을-막기-위한-방법">6-2. event bubbling을 막기 위한 방법</h3>
<h3 id="6-3-event-bubbling을-활용하기-위한-방법">6-3. event bubbling을 활용하기 위한 방법</h3>
<h2 id="7-typescript란">7. TypeScript란?</h2>
<h3 id="7-1-typescript특징에-대해서-설명">7-1. TypeScript특징에 대해서 설명</h3>
<h2 id="8-contextapi란">8. contextAPI란?</h2>
<h1 id="🖤🖤🖤">🖤🖤🖤</h1>
<h2 id="9-html이-렌더링중-js가-실행되면-렌더링이-멈추는-이유는">9. Html이 렌더링중 js가 실행되면 렌더링이 멈추는 이유는?</h2>
<h2 id="10-spa와-ssr서버사이드렌더링의-차이점은">10. SPA와 SSR(서버사이드렌더링)의 차이점은?</h2>
<h2 id="11-sassscssstyledcomponent비교">11. SASS,SCSS,StyledComponent비교</h2>
<h2 id="12-js성능-최적화를-위한-방법">12. js성능 최적화를 위한 방법</h2>
<h2 id="13-vue와-react의-차이점은">13. Vue와 React의 차이점은?</h2>
<h2 id="14-es6의-arrow-function을-사용할때-이유는">14. ES6의 arrow function을 사용할때 이유는?</h2>
<h2 id="15-var-let-const-차이점">15. var, let ,const 차이점</h2>
<h2 id="16-cors란">16. CORS란?</h2>
<h3 id="16-1-cors를-해결하는-방법은">16-1. CORS를 해결하는 방법은?</h3>
<h1 id="🖤">🖤</h1>
<h2 id="17-seo란">17. SEO란?</h2>
<h2 id="18-rdbms란">18. RDBMS란?</h2>
<h2 id="19-mysql의-종류">19. mySql의 종류</h2>
<hr>
<h2 id="1-브라우저의-렌더링-과정">1. 브라우저의 렌더링 과정</h2>
<h2 id="2-http와-https의-차이">2. http와 https의 차이</h2>
<h2 id="3-oop에-대한-설명">3. oop에 대한 설명</h2>
<h2 id="4-함수형-프로그래밍">4. 함수형 프로그래밍</h2>
<h2 id="5-웹프로토콜이란">5. 웹프로토콜이란?</h2>
<h2 id="6-asynchronous란">6. Asynchronous란?</h2>
<h3 id="6-1-ajax란">6-1. AJAX란?</h3>
<h3 id="6-2-axios-library란">6-2. Axios library란?</h3>
<h2 id="7-promise란">7. Promise란?</h2>
<h3 id="7-1-callback이란">7-1. Callback이란?</h3>
<h3 id="7-2-promise와-callback의-차이와-장단점-설명">7-2. promise와 callback의 차이와 장단점 설명</h3>
<h3 id="7-3-async와-await이란-promise와-비교한다면">7-3. Async와 Await이란? promise와 비교한다면?</h3>
<h2 id="8javascript타입">8.javaScript타입</h2>
<h3 id="8-1-원시타입은">8-1. 원시타입은?</h3>
<h3 id="8-2-execution-context에-대해-설명">8-2. Execution Context에 대해 설명</h3>
<h2 id="9-프로토타입이란">9. 프로토타입이란?</h2>
<h2 id="10-js의-this란">10. js의 This란?</h2>
<h3 id="10-1-일반함수의-this와-화살표함수의-this의-차이는">10-1. 일반함수의 This와 화살표함수의 This의 차이는?</h3>
<h2 id="11-callapplybind함수에-대한-설명">11. Call,Apply,Bind함수에 대한 설명</h2>
<h2 id="12-es6를-지원하지-않는-브라우저에서-사용하는것은">12. ES6를 지원하지 않는 브라우저에서 사용하는것은?</h2>
<h3 id="12-1-babel이란">12-1. Babel이란?</h3>
<h2 id="13-varletconst를-scope의-개념에서-설명">13. var,let,const를 scope의 개념에서 설명</h2>
<h2 id="14-class란-prototypefunction의-es5로-class를-구현할-수-있는가">14. Class란? Prototype,function의 es5로 class를 구현할 수 있는가?</h2>
<h2 id="15-react란">15. React란?</h2>
<h3 id="15-1-react의-상태관리는-어떻게-하는가">15-1. React의 상태관리는 어떻게 하는가?</h3>
<h3 id="15-2-redux에-대한-설명">15-2. Redux에 대한 설명</h3>
<h3 id="15-3-context-api에-대해-설명">15-3. context-API에 대해 설명</h3>
<h3 id="15-4-클래스형과-함수형의-차이">15-4. 클래스형과 함수형의 차이</h3>
<h3 id="15-5-lifecycle-method에-대해-설명">15-5. lifeCycle Method에 대해 설명</h3>
<h2 id="16-라이브러리와-프레임워크에-대해-설명">16. 라이브러리와 프레임워크에 대해 설명</h2>
<h2 id="17-메소드-체이닝이란">17. 메소드 체이닝이란?</h2>
<h3 id="17-1-메소드-체이닝의-장단점">17-1. 메소드 체이닝의 장단점</h3>
<h2 id="18-restful-api란">18. RESTful API란?</h2>
<h3 id="18-1-restful-api의-장단점-통신방법">18-1. RESTful API의 장단점, 통신방법</h3>
<h2 id="19-cors란">19. CORS란?</h2>
<h3 id="19-1-cors를-해결하는-방법">19-1. CORS를 해결하는 방법</h3>
<h2 id="20-eslint란">20. ESlint란?</h2>
<h2 id="21-prettier란">21. Prettier란?</h2>
<h2 id="22-webpack이란">22. Webpack이란?</h2>
<h2 id="23-npm-과-yarn의-차이점">23. npm 과 yarn의 차이점</h2>
<h2 id="24-배포를-해본-경험">24. 배포를 해본 경험</h2>
<h2 id="25-적응형과-반응형의-차이점">25. 적응형과 반응형의 차이점</h2>
<h2 id="26-packagejson의-역할">26. package.json의 역할</h2>
<h3 id="26-1-dependencies와-devdependencies의-차이는">26-1. dependencies와 devDependencies의 차이는?</h3>
<h2 id="27-프로세스와-스레드의-정의와-차이점">27. 프로세스와 스레드의 정의와 차이점</h2>
<h2 id="28-csr정의-과정">28. csr정의, 과정</h2>
<h2 id="29-ssr정의-과정">29. ssr정의, 과정</h2>
<h2 id="30-call-by-value-vs-call-by-ref">30. Call by value vs Call by ref</h2>
<h2 id="31-null-vs-undefined의-차이">31. null vs undefined의 차이</h2>
<h2 id="32-inline-vs-inline-block">32. inline vs inline block</h2>
<h2 id="33-virtual-dom이란-장단점">33. virtual DOM이란?-장단점</h2>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Uncaught SyntaxError : Unexpected token '<' chunk.js]]></title>
            <link>https://velog.io/@lemon-ginger/Uncaught-SyntaxError-Unexpected-token-chunk.js</link>
            <guid>https://velog.io/@lemon-ginger/Uncaught-SyntaxError-Unexpected-token-chunk.js</guid>
            <pubDate>Sun, 11 Apr 2021 07:57:12 GMT</pubDate>
            <description><![CDATA[<p>create-react-app으로 만들었던 웹사이트를 돌려보았는데
생각지도 못한 error가 발생했다!
검색해보니 생각보다 빈번한 에러인듯 하다😇</p>
<h3 id="원인">원인</h3>
<ul>
<li>배포 후 접속하면 index.html이 브라우저의 캐시 상태이기 때문에
배포 바로 이전의 index.html이다.
그 안에 번들링한 js파일을 불러오는 부분이 배포 전 번들링 파일을 임베드 하기 때문</li>
</ul>
<p>출처에 아주 자세하게 해결방법이 나와있다!🥳</p>
<p>출처:<a href="http://lab.naminsik.com/4011">http://lab.naminsik.com/4011</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Manifest: Line:1, column: 1, Syntax error.]]></title>
            <link>https://velog.io/@lemon-ginger/Manifest-Line1-column-1-Syntax-error</link>
            <guid>https://velog.io/@lemon-ginger/Manifest-Line1-column-1-Syntax-error</guid>
            <pubDate>Sun, 11 Apr 2021 07:56:34 GMT</pubDate>
            <description><![CDATA[<p>예전에 만들었던 포트폴리오를 다시 실행해보니 이런 에러가 떴다!
검색해보니까 프로젝트를 만들었던 로컬을 옮겼을때 생긴 에러 같다🙄</p>
<p>출처:
<a href="https://stackoverflow.com/questions/57423244/manifest-line-1-column-1-syntax-error-on-chrome-browser">https://stackoverflow.com/questions/57423244/manifest-line-1-column-1-syntax-error-on-chrome-browser</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Class Component에서 Function Component로 바꾸기! ]]></title>
            <link>https://velog.io/@lemon-ginger/Class-Component%EC%97%90%EC%84%9C-Function-Component%EB%A1%9C-%EB%B0%94%EA%BE%B8%EA%B8%B0</link>
            <guid>https://velog.io/@lemon-ginger/Class-Component%EC%97%90%EC%84%9C-Function-Component%EB%A1%9C-%EB%B0%94%EA%BE%B8%EA%B8%B0</guid>
            <pubDate>Tue, 06 Apr 2021 10:04:58 GMT</pubDate>
            <description><![CDATA[<p><a href="https://nimblewebdeveloper.com/blog/convert-react-class-to-function-component">https://nimblewebdeveloper.com/blog/convert-react-class-to-function-component</a>
를 공부해보았당!
이 글 넘 자세하고 좋아...
들어가서 읽어보세요&gt;&lt;ㅋ</p>
<h3 id="1-class에서-function으로-바꾸세요">1. Class에서 Function으로 바꾸세요</h3>
<p><strong>From</strong></p>
<pre><code class="language-javascript">class MyComponent extends React.Component{
    //...
}</code></pre>
<p><strong>to</strong></p>
<pre><code class="language-javascript">function MyComponent(props) {
    //...
}</code></pre>
<h3 id="2-render-메소드를-지우세요">2. render 메소드를 지우세요</h3>
<p>render 메소드를 지우고 return을 포함한 모든것들을 유지시키세요
그리고 function Component의 마지막에 두세요</p>
<p><strong>From</strong></p>
<pre><code class="language-javascript">render() {
    return (&lt;p&gt;Hello, world&lt;/p&gt;);
}</code></pre>
<p><strong>to</strong></p>
<pre><code class="language-javascript">function MyComponent(props){
    return (&lt;p&gt;Hello, world&lt;/p&gt;);
}//end of function</code></pre>
<h3 id="3-모든-메소드를-function으로-변환시키세요">3. 모든 메소드를 function으로 변환시키세요.</h3>
<p>Class 메소드들은 function 안에서 전혀 작동하지 않습니다.
그러니까 모두 functions로 변환시키세요!</p>
<p><strong>From</strong></p>
<pre><code class="language-javascript">class MyComponent extends React.Component{
  onClickHandler(e){
      //...
  }
}</code></pre>
<p><strong>to</strong></p>
<pre><code class="language-javascript">function MyComponent{
    const onClickHandler=(e)=&gt; {
        //...
    }
}</code></pre>
<h3 id="4-this로-참조한것들을-지우세요">4. this로 참조한것들을 지우세요</h3>
<p>this들은 더이상 function 안에서 유용하지 않을거에요.
렌더와 function들 안에서 this들을 모두 지우세요.</p>
<p>*<em>From *</em></p>
<pre><code class="language-javascript">class MyComponent(props) extends React.Component{
    //...
  mySpecialFunction(){
      console.log(&#39;you clicked the button!&#39;);
  }

  onClickHandler(e){
      this.mySpecialFunction();
  }

  render(){
      return(
        &lt;div&gt;
              &lt;p&gt; Hello, {this.props.name}&lt;/p&gt;
              &lt;button onClick={this.onClickHandler}&gt; Click! &lt;/button&gt;
          &lt;/div&gt;
    )
  }
}</code></pre>
<p><strong>To</strong></p>
<pre><code class="language-javascript">function MyComponent(props){
    //...
  const mySpectialFunction = () =&gt; {
      console.log(&#39;you clicked the button!&#39;);
  }

  const onClickHandler=(e) =&gt; {
      mySpecialFunction();
  }

  return (
        &lt;div&gt;
              &lt;p&gt; Hello, {props.name}&lt;/p&gt;
              &lt;button onClick={onClickHandler}&gt; Click! &lt;/button&gt;
          &lt;/div&gt;
  );

}</code></pre>
<h3 id="5-constructor를-지우세요">5. constructor를 지우세요!</h3>
<p>constructor를 지우는것은 약간 까다롭기 때문에 더 상세하게 설명할게요.</p>
<ol>
<li>useState</li>
</ol>
<p><strong>Instead of</strong></p>
<pre><code class="language-javascript">constructor(props){
  super(props);
  //Set Initial state
  this.state = {
      counter:0,
    name: &quot;&quot;
  }
}</code></pre>
<p>*<em>useState Hook을 대신 사용하세요! *</em></p>
<pre><code class="language-javascript">function MyComponent(props) {
    const [counter,setCounter] = useState(0);
      const [name,setName] = useState(&quot;&quot;);
}</code></pre>
<ol start="2">
<li>event handler로 바인딩된것들을 지우세요
우리는 더이상 function Component에서 event Handler를 바인딩할 필요가 없어요.</li>
</ol>
<pre><code class="language-javascript">constructor(props){
    this.onClickHandler = this.onclickHandler.bind(this);
}</code></pre>
<p>우리는 간단하게 이 줄을 지울 수 있습니다</p>
<h3 id="6-thissetstate를-대체하자">6. this.setState를 대체하자</h3>
<p>이제 this.setState는 명확하게 우리의 function Component에 존재할 필요가 없어요! 우리는 대신에 setter라고 불리는 걸로 다 대체할거에요! </p>
<p><strong>이것들을 대체하세요</strong></p>
<pre><code class="language-javascript">class MyComponent extends React.Component{
    onClickHandler(e){
        this.setState({count:this.state.count+1})
    }
}</code></pre>
<p><strong>이걸로 대체하세요!</strong></p>
<pre><code class="language-javascript">function MyComponet{
    const [count,setCount] = useState(0);
      const onClickHandler = e =&gt; {
        setCount(count+1);
    }
}</code></pre>
<h3 id="7-상태-업데이트를-위한-useeffect">7. 상태 업데이트를 위한 useEffect</h3>
<p>state가 업데이트 된 후에 실행되던 callback을
어떻게 this.setState가 받는지 기억해?
useState의 업데이터 함수는 그런게 아니라
대신에 우리는 useEffect hook을 사용해야만 합니다.
useEffect는 그 자신의 dependencies들이 변화가 있을때마다 trigger가 될것입니다.</p>
<p><strong>만약에 당신이 이렇게 했었다면</strong></p>
<pre><code class="language-javascript">this.setState({counter: this.state.counter+1}, () =&gt; {
  console.log(&#39;Counter was updated!&#39;)
})</code></pre>
<p><strong>대신 이렇게 바꾸세요</strong></p>
<pre><code class="language-javascript">    const [counter,setCounter] = useState(0);

    useEffect(()=&gt;{
        console.log(&#39;counter changed!&#39;);
    },[counter])
</code></pre>
<h3 id="8-lifecycle-메소드들을-hook으로-교체하세요">8. lifecycle 메소드들을 hook으로 교체하세요.</h3>
<p><strong>ComponentDidMount</strong>
componentDidMount메소를 사용하는대신에
<strong>빈 dependency배열을 쓰는 useEffect hook을 사용</strong>하세요!</p>
<pre><code class="language-javascript">useEffect(()=&gt;{
    console.log(&#39;component mounted!&#39;)
},[]) //비어있는 배열이 있다는것을 알려줘야함!
</code></pre>
<p><strong>ComponentWillUnmount</strong>
리액트 트리에서 컴포넌트를 지우기전에 clean up하기 위해서
componentWillUnmount메소드를 사용하는 대신에
빈 배열에 의존하는 useEffect hook을 사용하는 function을 리턴해줍니다.</p>
<pre><code class="language-javascript">useEffect(()=&gt;{
    console.log(&#39;component mounted&#39;);
  //return a function to execute at unmount
  return ()=&gt;{
      console.log(&#39;component will unmount&#39;)
  }
},[]) //빈배열을 선언하세요!</code></pre>
<p><strong>ComponentDidUpdate</strong>
만약에 당신이 useEffect에서 두번째 인자로 아무것도 전달하지 않는다면
컴포넌트가 업데이트 될때마다 트리거가 될것이다.
그러니까 componentDidUpdate를 사용하는것 대신에 아래에 나오는것을 사용하세요</p>
<pre><code class="language-javascript">useEffect(()=&gt;{
    console.log(&#39;component updated!&#39;);
}) // 두번째 인자로 아무것도 없다고 표시하기!</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Hook "useState" is called in function Error]]></title>
            <link>https://velog.io/@lemon-ginger/React-Hook-useState-is-called-in-function-Error</link>
            <guid>https://velog.io/@lemon-ginger/React-Hook-useState-is-called-in-function-Error</guid>
            <pubDate>Thu, 01 Apr 2021 08:57:31 GMT</pubDate>
            <description><![CDATA[<p>component의 첫 글자를 대문자로 바꿔준다!
와 진짜😇</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Router]]></title>
            <link>https://velog.io/@lemon-ginger/React-Router</link>
            <guid>https://velog.io/@lemon-ginger/React-Router</guid>
            <pubDate>Mon, 15 Mar 2021 05:52:06 GMT</pubDate>
            <description><![CDATA[<p>Routing이란?
프로세스,network의 트래픽의 path를 선택하는 프로세스이다.
url을 줬을때 어떤 페이지로 연결하는지 결정해주는것.</p>
<h2 id="react-router란">React-Router란?</h2>
<h3 id="usehistory-hook">useHistory hook</h3>
]]></description>
        </item>
    </channel>
</rss>