<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>everyone_joy.log</title>
        <link>https://velog.io/</link>
        <description>개린이</description>
        <lastBuildDate>Mon, 23 Jan 2023 16:04:25 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>everyone_joy.log</title>
            <url>https://velog.velcdn.com/images/everyone_joy/profile/431b495e-406b-486c-85c2-d91bd5d4b9e2/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. everyone_joy.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/everyone_joy" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[React-Native | 간단한 컴포넌트 정리]]></title>
            <link>https://velog.io/@everyone_joy/React-Native-t58sepgj</link>
            <guid>https://velog.io/@everyone_joy/React-Native-t58sepgj</guid>
            <pubDate>Mon, 23 Jan 2023 16:04:25 GMT</pubDate>
            <description><![CDATA[<h1 id="1-imgaebackground">1. ImgaeBackground</h1>
<p><code>import { ImageBackground } from &quot;react-native&quot;</code></p>
<blockquote>
<pre><code>&lt;ImageBackground resizeMode=&quot;cover|contain|repeat|...&quot;&gt;</code></pre></blockquote>
<pre><code>- 웹 css의 object랑 같은 개념!
- 이미지를 화면크기에 맞게 꽉차게 보여줄지, 반복해서 보여줄지 등 설정하는 것!

&lt;br&gt;

&gt; ```
&lt;ImageBackground imageStyle={}&gt;</code></pre><ul>
<li>ImageBackground컴포넌트는 <code>style={}</code>도 적용할 수 있고, <code>imageStyle={}</code>도 적용할 수 있다.</li>
<li>차이는 <code>style={}</code>은 <code>&lt;View&gt;</code>와 같이 한 공간에 전체적으로 스타일을 적용한 것 이라면, <code>imageStyle={}</code>은 오직 이미지에만 스타일을 적용하는 것이다.</li>
</ul>
<br>

<h2 id="📓-예시-📓">📓 예시 📓</h2>
<h3 id="imagestyle-적용-전"><code>imageStyle={}</code> 적용 전</h3>
<p>  <img src="https://velog.velcdn.com/images/everyone_joy/post/c5e2b698-05be-4338-8862-4c8a687172b8/image.png" alt=""></p>
<pre><code class="language-javascript">&lt;ImageBackground
    source={require(&quot;./assets/images/image.png&quot;)}
    resizeMode=&quot;cover&quot;
    style={styles.rootScreen} // rootScreen은 flex:1만 들어가 있는 상태
&gt;</code></pre>
<br>

<h3 id="imagestyle-적용-후"><code>imageStyle={}</code> 적용 후</h3>
<p>  <img src="https://velog.velcdn.com/images/everyone_joy/post/f92d97d0-c22c-4d55-a67a-68cf0c102f12/image.png" alt=""></p>
<pre><code class="language-javascript">&lt;ImageBackground
    source={require(&quot;./assets/images/image.png&quot;)}
    resizeMode=&quot;cover&quot;
    style={styles.rootScreen}
    imageStyle={styles.backgroundImage} // opacity: 0.15
&gt;</code></pre>
<hr>
  <br>

<h1 id="2-safeareaview">2. SafeAreaView</h1>
<p>  <code>import {SafeAreaView} from &#39;react-native&#39;</code></p>
<br>

<blockquote>
<p>애플은 맨 위에 노치에 가려 입력한 데이터들이 안 보일 수도 있다. 이 컴포넌트로 감싼 태그들이 <u><strong>노치에 가리지 않도록 자동적으로 자리를 설정</strong></u>해주는 컴포넌트이다.</p>
</blockquote>
  <br>

<h3 id="safeareaview-적용-전"><code>&lt;SafeAreaView&gt;</code> 적용 전</h3>
<img src="https://velog.velcdn.com/images/everyone_joy/post/7b2bd07b-71ab-4c0e-8859-8dcd75ca56e3/image.png" />

<br>


<h3 id="safeareaview-적용-후"><code>&lt;SafeAreaView&gt;</code> 적용 후</h3>
<img src="https://velog.velcdn.com/images/everyone_joy/post/021a9432-e2b0-43e9-9885-c7daa1367afb/image.png" />

<pre><code class="language-javascript">&lt;SafeAreaView style={styles.rootScreen}&gt; // rootScreen =&gt; flex:1 
    {children}
&lt;/SafeAreaView&gt;</code></pre>
<ul>
<li>해당 컴포넌트를 <code>&lt;SafeAreaView&gt;</code>로 감싸주기만 하면 끄읏-! 🤓</li>
<li>굳이 padding을 쓰지 않고도 하나의 컴포넌트로 해결이 가능해서 깔끔하고 좋다. </li>
<li>App컴포넌트 전체style에 적용하면 한번만 넣어주고 끄읏!!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[React-Native | FlatList]]></title>
            <link>https://velog.io/@everyone_joy/React-Native-FlatList</link>
            <guid>https://velog.io/@everyone_joy/React-Native-FlatList</guid>
            <pubDate>Thu, 19 Jan 2023 08:30:01 GMT</pubDate>
            <description><![CDATA[<p><a href="https://reactnative.dev/docs/flatlist">https://reactnative.dev/docs/flatlist</a>_</p>
<blockquote>
<h3 id="scrollview와-flatlist의-차이점"><code>&lt;ScrollView&gt;</code>와 <code>&lt;FlatList&gt;</code>의 차이점</h3>
</blockquote>
<p>둘다 &#39;react-native&#39;에서 기본적으로 제공되는 기능들이다. </p>
<pre><code class="language-javascript">import {ScrollView , FlatList} from &#39;react-native&#39;</code></pre>
<p>데이터가 화면 밖을 벗어났을 때 스크롤 기능이 작동되는 기능들이지만 차이점이 있다.</p>
<hr>
<br>

<h3 id="scrollview는-모든-하위-데이터를-한번에-렌더링-한다"><code>&lt;ScrollView&gt;</code>는 모든 하위 데이터를 한번에 렌더링 한다.</h3>
<p>즉 list가 10개 정도면 그나마 괜찮은데 많약 100개 이상이 넘어간다고 하면 <span style="color:blue"><strong>한번에</strong></span> 100개 이상의 데이터를 렌더링하기 때문에 불필요하기도, 속도도 저하되기도 한다.
<strong>출력해야하는 데이터가 고정적이고 데이터양이 많지 않을 때 사용이 권장되는 컴포넌트이다.</strong></p>
<p><br><br></p>
<h3 id="flatlist는-화면에-보여지는-부분만-렌더링한다"><code>&lt;FlatList&gt;</code>는 화면에 보여지는 부분만 렌더링한다.</h3>
<p><u>데이터 양을 알 수 없고 데이터 길이가 고정되지 않은 상황에 사용하도록 권장하는 컴포넌트이다.</u> 덕분에 불필요한 렌더링이 실행되지 않아 더욱 효율적이다.</p>
<br>

<blockquote>
<h3 id="flatlist-사용예제"><code>&lt;FlatList&gt;</code> 사용예제</h3>
</blockquote>
<pre><code class="language-javascript">&lt;View style={styles.goalsContainer}&gt;
    &lt;FlatList
        data={courseGoals} 
        renderItem={(itemData) =&gt; {
            return (&lt;GoalItem text={itemData.item.text} id={itemData.item.id}]/&gt;)}} 
          // 모든 항목에서 key를 가져오려고 호출하는 함수
        keyExtractor={(item, index) =&gt; {
            return item.id}}
     /&gt;
&lt;/View&gt;

// 여기 item은 FlatList가 내부적으로 생성한 객체이다!!
// 데이터 배열 내 개별 데이터 항목으로 감싸 준 객체</code></pre>
<br>

<p><img src="https://velog.velcdn.com/images/everyone_joy/post/5aa5b816-397d-4a62-b50e-8894e205e12e/image.png" alt=""></p>
<ul>
<li>react-native 공식 문서에 적힌 내용!!
<a href="https://reactnative.dev/docs/scrollview">https://reactnative.dev/docs/scrollview</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 문제]]></title>
            <link>https://velog.io/@everyone_joy/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C-37pajdw7</link>
            <guid>https://velog.io/@everyone_joy/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C-37pajdw7</guid>
            <pubDate>Mon, 09 Jan 2023 05:17:27 GMT</pubDate>
            <description><![CDATA[<h2 id="문제--점의-위치-구하기">문제 | 점의 위치 구하기</h2>
<br>

<p><strong>문제설명</strong>
사분면은 한 평면을 x축과 y축을 기준으로 나눈 네 부분입니다. 사분면은 아래와 같이 1부터 4까지 번호를매깁니다.</p>
<img src='https://velog.velcdn.com/images/everyone_joy/post/b9d5c571-3171-432f-bc49-7c4999ed37d3/image.png' width=300 height=320 />

<ul>
<li>x 좌표와 y 좌표가 모두 양수이면 제1사분면에 속합니다.</li>
<li>x 좌표가 음수, y 좌표가 양수이면 제2사분면에 속합니다.</li>
<li>x 좌표와 y 좌표가 모두 음수이면 제3사분면에 속합니다.</li>
<li>x 좌표가 양수, y 좌표가 음수이면 제4사분면에 속합니다.</li>
</ul>
<p>x 좌표 (x, y)를 차례대로 담은 정수 배열 <code>dot</code>이 매개변수로 주어집니다. 좌표 <code>dot</code>이 사분면 중 어디에 속하는지 1, 2, 3, 4 중 하나를 return 하도록 solution 함수를 완성해주세요.</p>
<br>

<p><strong>제한사항</strong></p>
<ul>
<li><code>dot</code>의 길이 = 2</li>
<li><code>dot[0]</code>은 x좌표를, <code>dot[1]</code>은 y좌표를 나타냅니다</li>
<li>500 ≤ <code>dot</code>의 원소 ≤ 500</li>
<li><code>dot</code>의 원소는 0이 아닙니다.</li>
</ul>
<br>

<p><strong>입출력 예</strong></p>
<table>
<thead>
<tr>
<th align="left">dot</th>
<th align="left">result</th>
</tr>
</thead>
<tbody><tr>
<td align="left">[2,4]</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">[-7,9]</td>
<td align="left">2</td>
</tr>
</tbody></table>
<br>

<p><strong>입출력 예 설명</strong></p>
<p>입출력 예 #1</p>
<ul>
<li><code>dot</code>이 [2, 4]로 x 좌표와 y 좌표 모두 양수이므로 제 1 사분면에 속합니다. 따라서 1을 return 합니다.</li>
</ul>
<p>입출력 예 #2</p>
<ul>
<li><code>dot</code>이 [-7, 9]로 x 좌표가 음수, y 좌표가 양수이므로 제 2 사분면에 속합니다. 따라서 2를 return 합니다.</li>
</ul>
<hr>
<br>

<h3 id="📓-문제-해석하기-📓">📓 문제 해석하기 📓</h3>
<ul>
<li>각자 위치가 다르고 값이 다르다.</li>
<li>다름을 이용해서 조건문을 사용해 결과값을 리턴하도록 하자!</li>
</ul>
<pre><code class="language-javascript">// 풀이

function solution(dot){
  let num = 0;

    dot[0] &gt; 0 &amp;&amp; dot[1] &lt; 0 ? num = 4 
        : dot[0] &lt; 0 &amp;&amp; dot[1] &lt; 0 ? num = 3 
        : dot[0] &lt; 0 &amp;&amp; dot[1] &gt; 0 ? num = 2 
        : dot[0] &gt; 0 &amp;&amp; dot[1] &gt; 0 ? num = 1
        : num = 0

  return num;

}</code></pre>
<br>

<h3 id="💡-여기서-포인트-💡">💡 여기서 포인트 💡</h3>
<ul>
<li>if문은 되도록 사용하지 않고 삼항연산자를 이용하려고 했다.</li>
<li>동일하게 삼항연산자를 한 줄로 해결할 수 있는 방법을 발견했다.</li>
</ul>
<pre><code class="language-javascript">// 풀이

function solution(dot){
    return dot[0] &gt; 0 ? dot[1] &gt; 0 ? 1 : 4 : dot[1] &gt; 0 ? 2 : 3;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[React-Native | ScrollView]]></title>
            <link>https://velog.io/@everyone_joy/React-Native-ScrollView</link>
            <guid>https://velog.io/@everyone_joy/React-Native-ScrollView</guid>
            <pubDate>Tue, 03 Jan 2023 12:28:28 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/everyone_joy/post/15fe0935-382c-412a-b7f7-e8a1950c6f63/image.gif" alt=""></p>
<blockquote>
<p>화면에 1~10까지 적은 후 11을 입력했지만 11을 볼 수 없었다. 왜냐하면 스크롤 기능이 들어가 있지 않기 때문이다. react-native에서는 scroll기능을 추가해줘야 한다.</p>
</blockquote>
<p><br><br></p>
<h2 id="💡react-native에서-제공하는-전용-컴포넌트가-있다">💡React-Native에서 제공하는 전용 컴포넌트가 있다!</h2>
<br>

<h2 id="💻-scrollview-💻">💻 ScrollView 💻</h2>
<blockquote>
<p><code>&lt;View&gt;</code>를 비롯한 컨테이너 요소에 스크롤이 가능한 속성을 제공한다.</p>
</blockquote>
<pre><code class="language-javascript">import { ScrollView } from &#39;react-native&#39;;


&lt;ScrollView style={styles.goalsContainer}&gt;
      &lt;View style={styles.Wrapper}&gt;
          {arr.map((goal, index) =&gt; 
              &lt;View style={styles.Item} key={index}&gt;
                &lt;Text style={styles.Text}&gt;{goal}&lt;/Text&gt;
              &lt;/View&gt;)}
      &lt;/View&gt;
&lt;/ScrollView&gt;</code></pre>
<hr>
<br>

<p><code>&lt;ScrollView&gt;</code>를 적어준 후 앱을 확인해보면,,
<img src="https://velog.velcdn.com/images/everyone_joy/post/a7ec0580-faa3-42bc-8efc-d90aeff6fdb7/image.png" alt=""></p>
<ul>
<li>잡아놓은 css가 망가져있다..??</li>
<li>근데 스크롤은 된다...</li>
<li>그저 Scroll감싼 것 뿐인데 왜 이렇게 되는 걸까?</li>
</ul>
<br>

<blockquote>
<h3 id="이러한-이유는-스크롤이-가능한-영역은-부모-요소가-결정하기-때문이다">이러한 이유는 스크롤이 가능한 영역은 부모 요소가 결정하기 때문이다.</h3>
</blockquote>
<h2 id="☝🏻-즉">☝🏻 즉..!!</h2>
<p><code>&lt;View&gt;</code>로 감싼 후 <code>&lt;View&gt;</code> 높이를 제한하고 <code>&lt;View&gt;</code>의 style을 적용하면 된다!</p>
<pre><code class="language-javascript">import { ScrollView } from &#39;react-native&#39;;


&lt;View style={styles.goalsContainer}&gt;    // &lt;- 이 부분을 추가! &lt;View&gt;로 &lt;ScrollView&gt;를 감싸줌!!
  &lt;ScrollView&gt;
        &lt;View style={styles.Wrapper}&gt;
            {arr.map((goal, index) =&gt; 
                &lt;View style={styles.Item} key={index}&gt;
                  &lt;Text style={styles.Text}&gt;{goal}&lt;/Text&gt;
                &lt;/View&gt;)}
        &lt;/View&gt;
  &lt;/ScrollView&gt;
&lt;/View&gt;</code></pre>
<h3 id="💻-view로-감싸준-후-모습">💻 <code>&lt;View&gt;</code>로 감싸준 후 모습!</h3>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/98f4fd70-0a46-4a60-9aff-2638ff47ae4d/image.gif" alt=""></p>
<br>

<h4 id="style도-처음-설정한대로-잘-나오고-scroll로-잘-된다">style도 처음 설정한대로 잘 나오고, scroll로 잘 된다.</h4>
<hr>
<br>

<h2 id="▶️-docs에-보면-scrollview관련-기능들이-있다">▶️ docs에 보면 ScrollView관련 기능들이 있다.</h2>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/814ed6b9-74c3-419b-bd91-cf0c7404827e/image.png" alt=""></p>
<br>

<p><img src="https://velog.velcdn.com/images/everyone_joy/post/747c155c-b167-405d-9b73-134b272da06c/image.png" alt=""></p>
<blockquote>
<p>아래로 내려보면 사용 방법들이 있는데 그중 <code>alwaysBounceVertical</code>은 스크롤 바운스를 boolean값에 따라 실행이 될 수도 안 되게 할 수 도 있다.</p>
</blockquote>
<p><br><br></p>
<blockquote>
<h2 id="사용-예제">사용 예제</h2>
</blockquote>
<pre><code class="language-javascript">&lt;ScrollView alwaysBounceVertical={false}&gt;                      // 넘나 간단,,</code></pre>
<h3 id="적용된-모습-전후">적용된 모습 전,후</h3>
<br>

<h3 id="적용-전">적용 전</h3>
<img src='https://velog.velcdn.com/images/everyone_joy/post/d8c96bb8-44f4-4d07-a733-d35018b87d66/image.gif' />

<br>

<h3 id="적용-후">적용 후</h3>
<img src='https://velog.velcdn.com/images/everyone_joy/post/c46349c9-044f-46e7-907f-b765c935a6ce/image.gif' />

<ul>
<li>스크롤을 내려도 bounce기능이 사라짐!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 문제]]></title>
            <link>https://velog.io/@everyone_joy/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C-tgxp4qzo</link>
            <guid>https://velog.io/@everyone_joy/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C-tgxp4qzo</guid>
            <pubDate>Mon, 02 Jan 2023 16:28:26 GMT</pubDate>
            <description><![CDATA[<h2 id="문제--중앙값-구하기">문제 | 중앙값 구하기</h2>
<p>중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다. 예를 들어 [1, 2, 7, 10, 11]의 중앙값은 7입니다. 정수 배열 <code>array</code>가 매개변수로 주어질 때, 중앙값을 return 하도록 solution 함수를 완성해보세요.</p>
<br>

<p><strong>제한사항</strong></p>
<ul>
<li><code>array</code>의 길이는 홀수입니다.</li>
<li>0 &lt; <code>array</code>의 길이 &lt; 100</li>
<li>1,000 &lt; <code>array</code>의 원소 &lt; 1,000</li>
</ul>
<br>

<p><strong>입출력 예</strong></p>
<table>
<thead>
<tr>
<th align="left">array</th>
<th align="left">result</th>
</tr>
</thead>
<tbody><tr>
<td align="left">[1,2,7,10.11]</td>
<td align="left">7</td>
</tr>
<tr>
<td align="left">[9,-1,0]</td>
<td align="left">0</td>
</tr>
</tbody></table>
<br>

<p><strong>입출력 예 설명</strong></p>
<p>입출력 예 #1</p>
<ul>
<li>본문과 동일합니다.</li>
</ul>
<p>입출력 예 #2</p>
<ul>
<li>9, -1, 0을 오름차순 정렬하면 -1, 0, 9이고 가장 중앙에 위치하는 값은 0입니다.</li>
</ul>
<hr>
<br>

<h3 id="📓-문제-해석하기">📓 문제 해석하기</h3>
<ul>
<li>배열을 우선 오름차순으로 정렬해야한다.</li>
<li>배열의 중간값을 구해야한다.</li>
</ul>
<pre><code class="language-javascript">// 풀이

    function solution(array) {

        return array.sort((a,b) =&gt; a - b)[Math.floor(array.length / 2)]
}</code></pre>
<br>


<h3 id="💡-여기서-포인트-💡">💡 여기서 포인트 💡</h3>
<blockquote>
<p><strong>오름차순 먼저</strong>, 그 다음 배열의 중간값 구하기!</p>
</blockquote>
<ul>
<li>먼저 오름차순으로 만들어야 값을 바로 한줄에 적을 수 있다!<pre><code class="language-javascript">  array.sort((a-b) =&gt; a - b)

</code></pre>
</li>
</ul>
<p>// 내림차순은 b - a로 바꿔주면 된다.
    array.sort((a-b) =&gt; b - a)</p>
<pre><code>
- 배열은 **홀수**라고 조건에 나와있으니 배열을 2로 나누면 나머지를 제외시키고 몫으로 중간값을 구할 수 있다.

--- 

&lt;br&gt;&lt;br&gt;

## 문제2 | 배열 원소의 길이
문자열 배열 `strlist`가 매개변수로 주어집니다. `strlist` 각 원소의 길이를 담은 배열을 retrun하도록 solution 함수를 완성해주세요.

&lt;br&gt;

**제한사항**
- 1 ≤ `strlist` 원소의 길이 ≤ 100
- `strlist`는 알파벳 소문자, 대문자, 특수문자로 구성되어 있습니다.

&lt;br&gt;

**입출력 예**

|strlist|result|
|:----|:----|
|[&quot;We&quot;, &quot;are&quot;, &quot;the&quot;, &quot;world!&quot;]|[2, 3, 3, 6]|
|[&quot;I&quot;, &quot;Love&quot;, &quot;Programmers.&quot;]|[1, 4, 12]|

&lt;br&gt;

**입출력 예 설명**

입출력 예 #1
- [&quot;We&quot;, &quot;are&quot;, &quot;the&quot;, &quot;world!&quot;]의 각 원소의 길이인 [2, 3, 3, 6]을 return합니다.

입출력 예 #2
- [&quot;I&quot;, &quot;Love&quot;, &quot;Programmers.&quot;]의 각 원소의 길이인 [1, 4, 12]을 return합니다.
---

&lt;br&gt;

### 📓 문제 해석하기
- 배열 안에 있는 요소 하나하나를 건들여야 한다.
- 처음에는 for문으로 해결할 방법을 생각했음.

``` javascript
// 풀이

function solution(strlist) {

     let arr = [];

     for(let i=0; i&lt;strlist.length; i++) {
         arr.push(strlist[i].length )
     }

     return arr;
}</code></pre><ul>
<li>이 방법도 정답으로 나왔지만 좀 더 길이를 줄일 수 있는 방법을 생각했음!</li>
<li>많이들 쓰는 <code>map()</code>를 이용하는 것!</li>
</ul>
<br>

<pre><code class="language-javascript">// map()으로 풀이

function solution(strlist) {
   return strlist.map(el =&gt; el.length)
}</code></pre>
<ul>
<li>10줄에서 3줄로 코드길이가 훨씬 짧아졌다.</li>
</ul>
<br>



<h3 id="💡-여기서-포인트-💡-1">💡 여기서 포인트 💡</h3>
<blockquote>
<p>배열이라면 for문 말고도 map(), filter() ... 를 써보자.</p>
</blockquote>
<p>배열 함수를 알고있지만 for문이 익숙해서 계속 for문을 쓰게 되는 것 같다.
문제를 해석하고 map(), filter()... 메서드를 사용할 수 있는지 먼저 생각하는 습관을 기르자..!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 문제]]></title>
            <link>https://velog.io/@everyone_joy/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C-rc0brypt</link>
            <guid>https://velog.io/@everyone_joy/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C-rc0brypt</guid>
            <pubDate>Fri, 30 Dec 2022 09:55:26 GMT</pubDate>
            <description><![CDATA[<h2 id="문제--잘라서-배열로-저장하기">문제 | 잘라서 배열로 저장하기</h2>
<p>문자열 <code>my_str</code>과 <code>n</code>이 매개변수로 주어질 때, <code>my_str</code>을 길이 <code>n</code>씩 잘라서 저장한 배열을 return하도록 solution 함수를 완성해주세요.</p>
<br>

<p><strong>제한사항</strong></p>
<ul>
<li>1 ≤ <code>my_str</code>의 길이 ≤ 100</li>
<li>1 ≤ n ≤ <code>my_str</code>의 길이</li>
<li><code>my_str</code>은 알파벳 소문자, 대문자, 숫자로 이루어져 있습니다.</li>
</ul>
<br>

<p>** 입출력 예**</p>
<table>
<thead>
<tr>
<th align="left">my_str</th>
<th align="left">n</th>
<th align="left">result</th>
</tr>
</thead>
<tbody><tr>
<td align="left">&quot;abc1Addfggg4556b&quot;</td>
<td align="left">6</td>
<td align="left">[&quot;abc1Ad&quot;, &quot;dfggg4&quot;, &quot;556b&quot;]</td>
</tr>
<tr>
<td align="left">&quot;abcdef123&quot;</td>
<td align="left">3</td>
<td align="left">[&quot;abc&quot;, &quot;def&quot;, &quot;123&quot;]</td>
</tr>
</tbody></table>
<br>

<hr>
<h3 id="📓-문제-해석하기">📓 문제 해석하기</h3>
<p>- result는 배열로 나와야 한다.
- n씩 자르고 배열에 넣은 후, 문자열에 남아 있으면 안된다.
<em>(즉 길이에 영향을 미치면 안된다. 라고 생각)</em>
- 반복문이 필요함!</p>
<br>

<pre><code class="language-javascript">// 풀이
function solution(my_str, n) {

    let arr = [];

    for(let i=0; i &lt; my_str.length; i+=n){
        arr.push(my_str.slice(i,i+n))
    };
        return arr;
};</code></pre>
<br>

<h3 id="💡-여기서-포인트-💡">💡 여기서 포인트 💡</h3>
<blockquote>
<p>for문의 <code>i</code>로 n의 갯수마다 증가하는 값을 구해야 함.</p>
</blockquote>
<ul>
<li><p><code>for(let i=0; i &lt; my_str.length; i+=n)</code> 이 부분에서 n의 갯수만큼 반복해서 늘어나도록 for문 증감식에 <code>i = i + n</code> 으로 적어줌.</p>
</li>
<li><p><code>n = 3</code> 이라면 i값은 0 ▸ 3 ▸ 6 으로 늘어나게 된다.</p>
</li>
<li><p><code>slice(stateIndex, endIndex)</code> 함수와 n을 이용하여 <code>n</code>의 갯수만큼 잘라준다!</p>
</li>
<li><p>그 다음 <code>arr.push()</code>를 이용하여 배열에 넣어주면 끝!</p>
</li>
</ul>
<hr>
<h3 id="✚-strslicestarti-endi는-endindex값은-안-들어간다는-것-잊지말기">✚ str.slice(startI, endI)는 endIndex값은 안 들어간다는 것 잊지말기!</h3>
<pre><code class="language-javascript">let str = &#39;abcdef&#39;

str.slice(1,4)
// 예상 output: &#39;bcde&#39;

// 하지만 endIndex의 값은 안 들어가기 때문에,
// 실제 output: &#39;bcd&#39;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[faker라이브러리란?]]></title>
            <link>https://velog.io/@everyone_joy/faker%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%9E%80</link>
            <guid>https://velog.io/@everyone_joy/faker%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EB%9E%80</guid>
            <pubDate>Tue, 27 Dec 2022 14:10:25 GMT</pubDate>
            <description><![CDATA[<p>출처: <a href="https://www.npmjs.com/package/@faker-js/faker">https://www.npmjs.com/package/@faker-js/faker</a></p>
<blockquote>
<h2 id="faker라이브러리">faker라이브러리</h2>
</blockquote>
<p><code>npm i @faker-js/faker</code></p>
<p><strong><u>가짜 데이터를 만들어주는 라이브러리이다.</u></strong>
하드코딩으로 하면 시간도, 코드 길이도 길어지기 때문에 간편하게 사용이 가능하다.
<br>
<br></p>
<h2 id="💻-적용-💻">💻 적용 💻</h2>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/95ec712a-ac3a-48c2-8b93-c6f68c6c62cc/image.gif" alt=""></p>
<ul>
<li>faker라이브러리로 만든 랜덤 이름</li>
<li>20명의 이름을 하나하나 적어준 게 아니다!</li>
</ul>
<br>

<pre><code class="language-javascript">// 사용 코드

import {faker} from &#39;@faker-js/faker&#39;

export function createRandomUser() {
    return{
        userName: faker.internet.userName(),
          email: faker.internet.email(),
          Images: [{
            src: faker.image.imageUrl()
        }],
          contents: faker.lorem.sentence()
    };
};

// output: {name: &quot;kalepoul&quot;, email: &quot;naver@gmail.com&quot;, ...}</code></pre>
<ul>
<li><p>faker.범주.함수() 형태로 사용 가능하다</p>
</li>
<li><p>faker npm에 나와있는 범주들!
<img src="https://velog.velcdn.com/images/everyone_joy/post/e2c4ac96-9bb5-48d5-8f4e-027133266d70/image.png" alt=""></p>
</li>
</ul>
<h3 id="언어도-변경-가능하다-🔄">언어도 변경 가능하다 🔄</h3>
<p>기본값은 영어이고, 한국어도로 변경 가능!</p>
<pre><code class="language-javascript">import {faker} from &#39;@faker-js/faker&#39;

// 맨 위에 적어주기
faker.locale = &quot;ko&quot;;</code></pre>
<p><br><br></p>
<hr>
<h3 id="🖐-잠-깐-">🖐 잠 깐 !</h3>
<p><a href="https://www.npmjs.com/package/faker">https://www.npmjs.com/package/faker</a></p>
<ul>
<li>이름은 같은데 이 위에 라이브러리로는 설치 놉!!</li>
<li>제작자가 6버전부터 라이브러리를 망쳐버렸다고 한다!!</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[target, currentTarget 차이 | 이벤트 버블링, 이벤트 캡쳐링]]></title>
            <link>https://velog.io/@everyone_joy/target-currentTarget-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@everyone_joy/target-currentTarget-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Thu, 22 Dec 2022 16:41:00 GMT</pubDate>
            <description><![CDATA[<p><span style="color: ligthgray"><em>같이 스터디 하시는 분의 도움이 아니였다면ㅠㅠ 이 차이를 모르고 무지한 존재로 살았을 것이다ㅠㅠ 정말 감사함둥🥺</em> </span></p>
<blockquote>
<h2 id="eventtarget">event.Target</h2>
<p>*<em>내가 선택한 태그 그 자체!만 선택이 된다. *</em></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/3bc8b97c-0000-450b-ac6a-02498612dbbe/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/2d75c8de-b651-440c-b69b-9bc376d12eae/image.gif" alt=""></p>
<ul>
<li>div1 위에 div2가 있고, div2위에 div3있는 상황이다.</li>
<li>event.target은 부모로부터 이벤트가 위임되어 발생하는 자식의 위치, 즉 내가 클릭한 자식 요소를 반환한다.</li>
</ul>
<p><br><br></p>
<blockquote>
<h2 id="eventcurrenttarget">event.currentTarget</h2>
<p><strong>이벤트 핸들러가 부착된 부모요소가 반환된다.</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/70001f24-e05e-4e38-87b9-8b3a1dfa9450/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/52b5a5ef-e026-4e88-9417-77ef561b7188/image.gif" alt=""></p>
<ul>
<li>클릭이 일어난 요소부터 상위로 올라가며 이벤트 핸들러가 등록된 요소를 가리킨다.</li>
<li>3을 클릭하면 div3의 상위요소로 올라 타고 타고 타고<strong>(이벤트 버블링)</strong> 올라가서 부모요소(div1)를 가리킨다.</li>
</ul>
<p><br><br><br></p>
<blockquote>
<h2 id="target-currenttarget-또-다른-예시">target, currentTarget 또 다른 예시</h2>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/d1430692-97e9-4da0-82b9-3d31871c7049/image.png" alt=""></p>
</blockquote>
<br>

<p>▶️ <code>&lt;button&gt;확인&lt;/button&gt; 을 눌렀을 때!</code>
<img src="https://velog.velcdn.com/images/everyone_joy/post/2712799f-198d-41ba-b190-ba175ef39a7f/image.gif" alt=""></p>
<ul>
<li>current.target은 전체를 감싸고 있는 <code>&lt;div id={1}&gt; ... &lt;/div&gt;</code> 반환하고,</li>
<li>target은 선택한 그 요소!인 <code>&lt;button&gt;을 반환한다.</code></li>
</ul>
<br>

<hr>
<p>▶️ <code>&lt;span&gt;이벤트는 무엇?&lt;/span&gt; 을 눌렀을 때!</code>
<img src="https://velog.velcdn.com/images/everyone_joy/post/7bd7421b-61b7-4070-8c8d-9fdfa2d3c03c/image.gif" alt=""></p>
<ul>
<li>마찬가지로 current.target은 맨 위의 부모 요소인 <code>&lt;div id={1}&gt; ... &lt;/div&gt;</code> 를 반환하고,</li>
<li>target은 클릭 당한, 내가 선택한 그 요소 그 잡채!! <code>&lt;span&gt;이벤트는 무엇?&lt;/span&gt;</code>을 반환한다.</li>
</ul>
<p><br><br><br><br></p>
<hr>
<blockquote>
<h3 id="이벤트-버블링-event-bubbling">이벤트 버블링 (Event Bubbling)</h3>
</blockquote>
<p>div3 한 개만 클릭했을 뿐인데 왜 div1이 클릭되는 걸까?
<strong>그 이유는 <code>브라우저가 이벤트를 감지하는 방식때문이다!!!</code></strong></p>
<p>브라우저는 이벤트가 발생했을 때 <code>그 이벤트를 최상위에 있는 화면 요소까지 이벤트를 전파시킨다.</code></p>
<ul>
<li>3 =&gt; 2 =&gt; 1 순서로 div태그에 등록된 이벤트들이 실행된다.</li>
<li>마찬가지로 2를 클릭했으면 2 =&gt; 1 순으로 이벤트가 동작한다.</li>
</ul>
<p>하위에서 상위 요소로 이벤트 전파 방식을 <code>이벤트 버블링</code>이라고 한다.</p>
<br>


<blockquote>
<h3 id="이벤트-캡쳐링-event-captuaring">이벤트 캡쳐링 (Event Captuaring)</h3>
</blockquote>
<p><strong>이벤트 버블링과 반대로 움직인다.</strong> 상위에서 하위 요소로 내려간다!</p>
<ul>
<li>클릭한 이벤트 요소에서 최상위에서부터 훑고 내려오는 것이다!!!</li>
<li>만약 div1안에 div2, div2 안에 div3 이 있다고 한다면,</li>
<li>div3을 클릭해도 콘솔창에는 div1 ▶️ div2 ▶️ div3 순으로 반환된다!</li>
<li>상위에서 하위로!!</li>
</ul>
<p><br><br></p>
<p>도움 출처 :<a href="https://velog.io/@edie_ko/JavaScript-event-target%EA%B3%BC-currentTarget%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90">https://velog.io/@edie_ko/JavaScript-event-target%EA%B3%BC-currentTarget%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[react-hook-form | formState]]></title>
            <link>https://velog.io/@everyone_joy/react-hook-form-formState</link>
            <guid>https://velog.io/@everyone_joy/react-hook-form-formState</guid>
            <pubDate>Tue, 13 Dec 2022 09:35:29 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-javascript">    &lt;form onSubmit={handleSubmit(onClickSignUp)}&gt;
        &lt;S.Inputs
            type=&#39;text&#39;
            placeholder=&#39;@를 포함한 이메일을 입력해주세요&#39;
            {...register(&quot;email&quot;)}/&gt;

           &lt;S.Inputs
            type=&#39;password&#39; 
            placeholder=&#39;8자리 이상 비밀번호를 입력해주세요&#39;
            {...register(&quot;password&quot;)}/&gt;

        &lt;S.Inputs 
            type=&#39;text&#39; 
            placeholder=&#39;닉네임을 입력해주세요&#39;
            {...register(&quot;name&quot;)}/&gt;

        &lt;S.SignUpBtn&gt;회 원 가 입&lt;/S.SignUpBtn&gt;
    &lt;/form&gt;</code></pre>
<h3 id="상황">[상황]</h3>
<ul>
<li>react-hook-form과 yup으로 작성했다.</li>
<li>input창에 값이 올바르게 다 들어오면 버튼 배경색을 테마색으로 채워주고 싶었다.</li>
<li>state와 onChange함수로 했을 때는 값이 들어와 있는지 없는지 알 수 있었는데,</li>
<li>react-hook-form으로 적었을 때는 값이 들어와 있는지 없는지 확인 방법을 몰랐다.</li>
</ul>
<hr>
<br>


<h3 id="해결방법">[해결방법]</h3>
<blockquote>
<p>다행히도 <code>formState</code> 에 보면 <code>isValid</code>라는 기능이 있다.</p>
</blockquote>
<p><strong>hookform으로 지정한 input들 값이 에러없이 다 잘 들어가 있으면 true을 반환하고, 그렇지 않으면 false를 반환한다.</strong></p>
<br>

<p><strong>사용 방법으로는</strong></p>
<pre><code class="language-javascript">// container파일에서
    &lt;S.SignUpBtn isActive={formState.isValid}&gt;회 원 가 입&lt;/S.SignUpBtn&gt;</code></pre>
<pre><code class="language-css">/* css 파일에서 */
    background-color: ${(props:BackColorProps) =&gt; props.isActive ? &quot;rgba(30, 130, 76)&quot; : &quot;white&quot;};</code></pre>
<hr>
<br>

<p>이렇게 하면 잘 작동된다!
useState를 사용했을 때보다 코드 길이도 훨씬 줄어들고 state값을 일일이 저장하지 않아 속도도 빠르다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[어쩌다 마주친 에러 모습]]></title>
            <link>https://velog.io/@everyone_joy/%EC%96%B4%EC%A9%8C%EB%8B%A4-%EB%A7%88%EC%A3%BC%EC%B9%9C-%EC%97%90%EB%9F%AC-%EB%AA%A8%EC%8A%B5-wsz3zbt9</link>
            <guid>https://velog.io/@everyone_joy/%EC%96%B4%EC%A9%8C%EB%8B%A4-%EB%A7%88%EC%A3%BC%EC%B9%9C-%EC%97%90%EB%9F%AC-%EB%AA%A8%EC%8A%B5-wsz3zbt9</guid>
            <pubDate>Mon, 12 Dec 2022 09:12:37 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/everyone_joy/post/1da17a49-e987-4a14-9a70-b4b401500277/image.png" alt=""></p>
<ul>
<li>board의 댓글list를 DetailPresenter에 넣고 스타일을 이것저것 바꾸려고 하는데</li>
<li>터미널에서 <code>undefined</code> 뜨면서 적용이 안 된다.</li>
</ul>
<br />

<blockquote>
<h3 id="해결방법">[해결방법]</h3>
</blockquote>
<p>(사실 한번에 해결한 게 아니라 이곳저곳에서 하나하나씩 고치다 보니 해결이 됐다.)</p>
<ul>
<li><p>경로나 파일명 바꿀 때 바로바로 업데이트가 안 되는 것 같았다. UsedItem.tsx 파일을 usedItem.tsx 파일명으로 앞자리만 바꿨는데 계속 오류에는 대문자로 나와있었다. (Used파일은 이제 없는데,,) vscode를 몇 번 껐다켰는데도 오류창에는 이전 파일명이 나와있었다.
▶️ <strong>오타나 파일명을 잘 확인하기.</strong></p>
</li>
<li><p>Typescript를 사용하니 타입이 하나라도 안 넣거나 틀리면 퉷-! 해버림,,ㅠ 답답한 오류창을 보면 그.나.마 조금 해결이 됨,,
▶️ <span style="color: red"><strong>빨간 줄을 따라가자..!</strong></span></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[어쩌다 마주친 에러 모습]]></title>
            <link>https://velog.io/@everyone_joy/%EC%96%B4%EC%A9%8C%EB%8B%A4-%EB%A7%88%EC%A3%BC%EC%B9%9C-%EC%97%90%EB%9F%AC-%EB%AA%A8%EC%8A%B5-z47gkw0q</link>
            <guid>https://velog.io/@everyone_joy/%EC%96%B4%EC%A9%8C%EB%8B%A4-%EB%A7%88%EC%A3%BC%EC%B9%9C-%EC%97%90%EB%9F%AC-%EB%AA%A8%EC%8A%B5-z47gkw0q</guid>
            <pubDate>Mon, 05 Dec 2022 16:33:32 GMT</pubDate>
            <description><![CDATA[<h1 id="span-stylecolor-red-errors-span"><span style="color: red"> Errors </span></h1>
<p>🛠 수정 전
<img src="https://velog.velcdn.com/images/everyone_joy/post/ad42cf4b-a7cb-4d57-9e8e-294df04435cf/image.png" alt=""></p>
<br>


<p>🛠 수정 후
<img src="https://velog.velcdn.com/images/everyone_joy/post/5ffd6967-0594-414d-9855-be7d22201e85/image.png" alt=""></p>
<ul>
<li>local3000을 열어보니 데이터가 1도 없어졌음..</li>
<li>이게 뭐지,, 하다가 건들인 부분을 하나하나 고쳐가며 수정하고 있었는데</li>
<li>credentials부분에 뒤에 처음에는 &#39;s&#39;가 붙는 줄 알고 넣었던 부분이 잘못 되었던 것,,</li>
</ul>
<br>

<blockquote>
<h2 id="credentials"><strong>credentials</strong></h2>
<p>credentials는 백엔드와 쿠키를 주고 받을 때 &quot;쿠키에 담겨져 있는 내용은 중요하다.&quot;라고 알리는 기능.
이 부분이 있어야 백엔드와 주고 받을 수 있다. 그 의미로 &quot;include&quot;를 넣는다.</p>
</blockquote>
<p><em>&#39;s&#39;하나 붙였다고 데이터가 안 뜨는 게 참으로 무습다,, 진짜 토시 하나 제대로 안 썼다고 데이터 안 보여주는 심보보소,,8-8</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[fetchPolicy]]></title>
            <link>https://velog.io/@everyone_joy/fetchPolicy</link>
            <guid>https://velog.io/@everyone_joy/fetchPolicy</guid>
            <pubDate>Mon, 05 Dec 2022 06:40:14 GMT</pubDate>
            <description><![CDATA[<h2 id="apollo-client의-고급기능">Apollo-client의 고급기능</h2>
<hr>
<p>여러 컴포넌트가 있고, 각 컴포넌트들이 공유할 수 있는 global state가 있다고 가정해보자.
만약 <strong>Apollo-client</strong>로 global state를 만들게 된다면 Apollo-Cache라는 곳에 state값이 저장된다.</p>
<p>예를들어</p>
<blockquote>
<ol>
<li>[2번 컴포넌트]에서 UseQuery를 한 다음</li>
<li>받아온 데이터가 <u>Apollo-Cache에 저장된 후</u> [2번 컴포넌트]로 들어가게 됩니다.</li>
<li>이후 [3번 컴포넌트]에서 <strong>같은 데이터</strong>요청을 하게 되면 Apollo-Cache에 먼저가서 찾고자 하는 데이터가 있는지 확인하고, 있으면 백엔드에 요청을 하지 않고 바로 컴포넌트로 보내주게 된다.</li>
</ol>
</blockquote>
<h3 id="이를-apollo-client의-fetchpolicy라고-합니다">이를 Apollo-client의 fetchPolicy라고 합니다.</h3>
<p>fetchPolicy에는 여러가지 기능들이 있으며 <em>변경이 가능합니다.</em></p>
<blockquote>
<p>fetchPolicy의 기능</p>
</blockquote>
<ul>
<li><strong>cache-first</strong> : 캐시에 데이터가 있는지 먼저 확인</li>
<li><strong>network-only</strong> : 캐시에 있든 없든 무조건 백엔드에 요청.</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Error 객체]]></title>
            <link>https://velog.io/@everyone_joy/Error-%EA%B0%9D%EC%B2%B4</link>
            <guid>https://velog.io/@everyone_joy/Error-%EA%B0%9D%EC%B2%B4</guid>
            <pubDate>Wed, 23 Nov 2022 11:24:58 GMT</pubDate>
            <description><![CDATA[<p><em>에러는 좋은 친구 ^-^</em> <span style="color: white">뻥임</span></p>
<blockquote>
<p>자바스크립트는 Error 생성자 함수를 포함해 7가지의 에러 객체를 생성할 수 있는 Error생성자 함수를 제공한다고 한다!</p>
</blockquote>
<hr>
<br>

<table>
<thead>
<tr>
<th>생성자함수</th>
<th>인스턴트</th>
</tr>
</thead>
<tbody><tr>
<td>Error</td>
<td>일반적 에러 객체</td>
</tr>
<tr>
<td>SyntaxError</td>
<td>자바스크립트 문법에 맞지 않는 문을 해석할 때 발생하는 에러 객체</td>
</tr>
<tr>
<td>ReferenceError</td>
<td>참조할 수 없는 식별자를 참조했을 때 발생하는 에러 객체</td>
</tr>
<tr>
<td>TypeError</td>
<td>피연산자 또는 인수의 데이터 타입의 유효하지 않을 때 발생하는 에러 객체</td>
</tr>
<tr>
<td>RangeError</td>
<td>숫자값의 허용범위를 벗어났을 때 발생하는 에러 객체</td>
</tr>
<tr>
<td>URIError</td>
<td>encodeURI 또는 decodeURI 함수에 부적절한 인수를 전달했을 때 발생하는 에러 객체</td>
</tr>
<tr>
<td>EvalError</td>
<td>eval 함수에서 발생하는 에러 객체</td>
</tr>
</tbody></table>
<br>

<pre><code class="language-javascript">1 @ 1;  // output: SyntaxError: Invalid or unexpected token
foo(); // output: ReferenceError: foo is not defined
null.foo(); // output: TypeError: Cannot read property &#39;foo&#39; of null
new Array(-1) // output: RangeError: Invalid array length
decodeURIComponent(&#39;%&#39;) // output: URIError: URI malformed</code></pre>
<p><br><br></p>
<p>출처: 모던 자바스크립트 Deep Dive 책</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[정규표현식/ Saga/Effects]]></title>
            <link>https://velog.io/@everyone_joy/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-Saga</link>
            <guid>https://velog.io/@everyone_joy/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-Saga</guid>
            <pubDate>Wed, 16 Nov 2022 06:23:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><em>물론 다 그런 건 아니지만 만약 500에러가 뜨면 변수명이나 key값이 동일한지, 올바른 key값을 적었는지 확인하기. 500에러 뜰리가 없는데 떠서 &#39;왜지..&#39;했는데 props로 불러오는 key값을 잘못 적었다ㅎㅎ (엣큥-!)</em></p>
</blockquote>
<ul>
<li>//g //
  : 뒤에 g가 붙으면 문장 안에 있는 모두, g를 빼면 첫 번째 것만 선택된다.<br>
- . (점)
   : 한 글자
  <br></li>
<li>.+1
  : 모든 글자가 선택된다.  <br></li>
<li>[ ]
  : 괄호 안에 글자를 쓰면 그 글자만 선택된다.<br></li>
<li>[^ ]
  : ^가 붙으고 그 뒤에 글자를 제외하고 선택된다.  <br></li>
<li>\s 
  : 공백  <br>

</li>
</ul>
<hr>
<h1 id="saga">Saga</h1>
<pre><code class="language-javascript">export default function* Saga{

  return(

    )
}</code></pre>
<h2 id="특징">특징</h2>
<p>thunk는 예를들어 setTimeout()을 직접 하나하나 적어야 하는 부분이 있지만, saga는 이미 이런 이벤트들이 만들어져있다. (편하다는 소리)</p>
<h3 id="generator--중단점이-있는-함수">generator(*) : 중단점이 있는 함수</h3>
<ul>
<li><ol>
<li>*<em>yield *</em>: 중단점을 지정해주는 것
일반함수로는 중간에 중단하는 것이 불가능하다. 하지만 <code>yield</code>를 중간에 중단시점을 지정한 곳에 넣으면 함수가 중단이 된다.<br></li>
</ol>
</li>
<li><p>2.** 절대 중단하지 않는 함수**</p>
<pre><code class="language-javascript">      const gen = function*() {
              while(true){
                  yield &#39;무한&#39;;                
              }
         }</code></pre>
</li>
<li><p><em><code>yield</code>를 적으면 무한반복되지 않고 중단이 된다!!*</em></p>
</li>
<li><p>yield를 붙이는 이유 중 하나는 테스트하기가 정말 편안하기 때문이다.
왜냐하면 yield를 넣으면 한줄한줄 멈춤으로 한줄한줄 잘 작동하는지 확인을 할 수 있기 때문이다.</p>
</li>
</ul>
<br>

<ul>
<li><ol start="3">
<li>이벤트 리스너를 만들 수 있다.
<code>ex. 버튼을 누를 때 특정 이벤트를 활성하도록!!</code></li>
</ol>
</li>
</ul>
<pre><code class="language-javascript">    function* watchLogIn() {
        yield take(&#39;LOG_IN&#39;) // 해석 : &#39;LOG_IN&#39;이라는 액션을 실행될 때까지 기대리겠다.
    }</code></pre>
<p>그리고</p>
<pre><code class="language-javascript">3.    function logInAPI() {
      // [주의] 이 함수는 *(generator)를 붙이지 않는다.

      return axios.post(&#39;/api/login&#39;)
}

2.    function* logIn() {
    try{
        const result = yield call(logInAPI)        // logInAPI 요청 결과 담기
        yield put({
            type : &#39;LOG_IN_SUCCESS&#39;,
              data : result.data
        })   
    } catch (err) {
        yield put({
            type: &#39;LOG_IN_FAILURE&#39;,
            data: err.response.data
        })
    }
}


1.    function* watchLogIn() {
        yield take(&#39;LOG_IN&#39;, logIn)
          // 해석 : &quot;&#39;LOG_IN&#39;이라는 액션이 실행되면, logIn 함수를 실행하겠다&quot; 라는 뜻.
    }</code></pre>
<br>

<hr>
<blockquote>
<h1 id="saga-effects">saga effects</h1>
</blockquote>
<h2 id="take-takeevery">take, takeEvery</h2>
<ul>
<li><p>take effects는 일회성이다.
즉 한번 로그인-&gt;로그아웃하고 다시 로그인하려고 하면 안된다. 한번만 로그인 하고 끝이난다. 이를 해결하기 위해서 while!!</p>
</li>
<li><p>while, take는 동기적으로 동작하지만, takeEvery는 비동기로 동작한다는 차이가 있다.</p>
</li>
</ul>
<pre><code class="language-javascript">1. function* watchLogIn() {
          while(true){
            yield takeEvery(&#39;LOG_IN_REQUEST&#39;, logIn)
    }
 }


2. function* watchLogIn() {
        yield takeEvery(&#39;LOG_IN_REQUEST&#39;, logIn) 
  }</code></pre>
<p>1번 while문으로 쓴 것은 약간 직관적이지 않는다. 2번은 takeEvery는 길이도 짧아지고 좀더 직관적으로 간결하게 사용할 수 있다.
<br><br></p>
<hr>
<h2 id="takelastest">takeLastest</h2>
<p>하지만 <code>takeEvery</code> 를 사용한다면,
만약 클릭을 연속 3번을 눌렀다고 하면 3번 다 요청이 들어간다. 이를 방지하기 위해서 <code>takeLastest</code>를 사용하면 된다. 그렇다면 99번 눌러도 나머지 98번은 무시되고 마지막 99번째 딱 한번만 요청이 들어가게된다.</p>
<p>(사용예제)</p>
<pre><code class="language-javascript">     function* watchLogIn() {
        yield takeLastest(&#39;LOG_IN_REQUEST&#39;, logIn) 
  }</code></pre>
<br>

<hr>
<h2 id="throttle">Throttle</h2>
<p>여기에도 치명적인 단점이 있다.
응답을 취소하는 거지 요청을 취소하지 않는 것.
즉 서버쪽에서는 요청을 2번 받는 것이다.
프론트 쪽에서는 단 하나의 응답만 받지만 백엔드는 요청 2개를 받는다.
그래서 <code>takeLastest</code>만으로는 안되고, <code>Throttle</code> 를 사용한다.</p>
<br>

<pre><code class="language-javascript">     function* watchLogIn() {
        yield throttle(&#39;LOG_IN_REQUEST&#39;, logIn, 2000) 
  }</code></pre>
<p>&#39;2초동안 logIn 요청을 한번만 할 수 있도록 한 것&#39;
&#39;2초동안 100번을 연속해서 눌러도 한번만 요청이 들어간다.&#39;</p>
<br>

<hr>
<h2 id=""></h2>
<blockquote>
<p><strong>fork와 call의 차이점</strong>
fork는 비동기 함수 호출 , call은 동기 함수 호출이다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[css 선택자 | :nth-child() ]]></title>
            <link>https://velog.io/@everyone_joy/css-%EC%84%A0%ED%83%9D%EC%9E%90-nth-child</link>
            <guid>https://velog.io/@everyone_joy/css-%EC%84%A0%ED%83%9D%EC%9E%90-nth-child</guid>
            <pubDate>Mon, 14 Nov 2022 12:34:58 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>같이 스터디하는 분이 물어보셨던 건데 <img src="https://velog.velcdn.com/images/everyone_joy/post/59b4c45d-bcb1-4a62-96c5-6721d91225e8/image.png" alt="">
div에 nth-child()를 사용해서 각각 다른 색상을 채워야 했다.
(사실 저도 1도 몰라요,,,,)</p>
</blockquote>
<hr>
<p><br><br></p>
<blockquote>
<h2 id="코드">코드</h2>
</blockquote>
<pre><code class="language-javascirpt">        &lt;div class=&quot;color__container-colors&quot;&gt;

                &lt;div class=&quot;color__container-color&quot;&gt;
                    &lt;div class=&quot;color__names&quot;&gt;
                        &lt;h3 class=&quot;color__name&quot;&gt;Tomato&lt;/h3&gt;
                        &lt;span class=&quot;color__value&quot;&gt;#FF6347&lt;/span&gt;
                    &lt;/div&gt;
                &lt;/div&gt;

                &lt;div class=&quot;color__container-color&quot;&gt;
                    &lt;div class=&quot;color__names&quot;&gt;
                        &lt;h3 class=&quot;color__name&quot;&gt;Teal&lt;/h3&gt;
                        &lt;span class=&quot;color__value&quot;&gt;#008080&lt;/span&gt;
                    &lt;/div&gt;
                &lt;/div&gt;


                &lt;div class=&quot;color__container-color&quot;&gt;
                    &lt;div class=&quot;color__names&quot;&gt;
                        &lt;h3 class=&quot;color__name&quot;&gt;Burlywood&lt;/h3&gt;
                        &lt;span class=&quot;color__value&quot;&gt;#DEB887&lt;/span&gt;
                    &lt;/div&gt;
                &lt;/div&gt;


                &lt;div class=&quot;color__container-color&quot; id=&quot;backColor&quot;&gt;
                    &lt;div class=&quot;color__names&quot;&gt;
                        &lt;h3 class=&quot;color__name&quot;&gt;Thistle&lt;/h3&gt;
                        &lt;span class=&quot;color__value&quot;&gt;#D7BFD7&lt;/span&gt;
                    &lt;/div&gt;
                &lt;/div&gt;

        &lt;/div&gt;</code></pre>
<ol>
<li>처음에는 다 감싸고 있는 .color__container-colors에</li>
</ol>
<pre><code class="language-css">.color__container-colors:first-child{
    backgroundcolor : red;
}


.color__container-colors:nth-child(2){
    backgroundcolor : yellow;
}
.
.
.</code></pre>
<p>하면 될 거라고 생각했다.</p>
<p>하.지.만
<img src="https://velog.velcdn.com/images/everyone_joy/post/a78cc569-4de5-4566-b92d-c65f7631ab96/image.png" alt=""></p>
<h2 id="">...?</h2>
<p>예상으로는 <code>color__container-colors</code> 안에 4개의 <code>color__container-color</code>가 각각 순서대로 배경색이 입혀질 줄 알았는데 그것이 아니라 <code>nth-child가 div안으로 타고타고 들어가서 div안의 각 첫 번째, 두 번째 자녀에 다 색기 입혀지는 것</code>이었다.. (워매)
<br>
곰곰이 생각해보고, 이리저리 해보다가 <strong>제일 큰 div에 할 것이 아니라 배경색을 넣으려는 동일한 class이름의 div에 넣어보았다.</strong></p>
<pre><code class="language-css">.color__container-color:first-child {
    background-color: red;
}

.color__container-color:nth-child(2) {
    background-color:yellow;
}

.color__container-color:nth-child(3) {
    background-color:green;
}

.color__container-color:nth-child(4) {
    background-color:blue;
}</code></pre>
<h3 id="과연">과..연..</h3>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/1835da37-ea1d-454b-8126-7fc652802b4b/image.png" alt=""></p>
<hr>
<h3 id="쨔잔-">쨔잔-!!!!</h3>
<p>예상대로 되었다아하~!
처음에는 눈에 보이는 형태대로 첫 번째, 두 번째로 해서 넣으면 당연히 되겠지? 생각했지만 css와 나와의 생각은 달랐던 것이었다. (어쩌겠어,,, 콤퓨타님한테 맞춰야디,,)<br></p>
<ul>
<li><code>-colors</code> 안의 순서가 아니라</li>
<li>동일한 이름의<code>-color</code>의 적힌 순서 첫 번째(first-child)</li>
<li>그 다음 적힌 <code>-color</code>의 적힌 순서 두 번째(:nth-child(2))</li>
<li>다음에도 동일하게 적으면 된다.</li>
</ul>
<blockquote>
<h3 id="제일-중요한-것">제일 중요한 것!</h3>
<p>선택자 :nth-child()를 쓸 때 class이름이랑 <strong>띄어쓰기 X</strong></p>
</blockquote>
<pre><code class="language-css">- 맞게 쓴 부분
.color__container-color:nth-child(2){
    backgroundcolor: tomato
}</code></pre>
<pre><code class="language-css">- 틀리게 쓴 부분
.color__container-color :nth-child(2){
    backgroundcolor: tomato
}</code></pre>
<p>띄어쓰기를 해버리면 <code>-color의 두 번째 자식</code>이 선택되기 때문이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[async/await , 호이스팅 찍먹]]></title>
            <link>https://velog.io/@everyone_joy/asyncawait-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-%EC%B0%8D%EB%A8%B9</link>
            <guid>https://velog.io/@everyone_joy/asyncawait-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-%EC%B0%8D%EB%A8%B9</guid>
            <pubDate>Thu, 10 Nov 2022 17:00:49 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>비동기 실행 방식에서 동기 실행 방식으로 변경해주기 위해서 <code>async/await</code>이 필요한 것이다.</p>
</blockquote>
<h3 id="둘이-같이-실행하는-이유">둘이 같이 실행하는 이유</h3>
<p>둘 다 <strong>동기 통신</strong>을 위해서 사용한다.
만익 await가 없다면 <code>updateBoard</code>가 비동기 처리를 하는동안 <strong>기다려주지 않고 바로 다음 줄로 넘어가기 때문에</strong> DB에 저장되기 전에 &quot;수정이 완료되었습니다.&quot; 라고 뜬다.. 따라서 updateBoard를 동기처리를 해서 등록할 때까지 기다리도록 해주는 것이 await의 역할이다.</p>
<p>즉, <strong>await를 사용함으로써 비동기처리 함수인 updateBoard를 동기처리 함수로 바꿔주어 제대로 등록이 될 때까지 기다려주는 역할이다.</strong></p>
<hr>
<h3 id="호이스팅">호이스팅</h3>
<p>호이스팅이란 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미한다.</p>
<p>즉, 호이스팅은 <code>변수의 선언</code>과 <code>초기화</code>를 <code>분리하여</code> <code>선언만 코드의 최상단으로 끌어올려주는 것</code>이다. 따라서 변수를 정의하는 코드보다 사용하는 코드가 앞서 등장할 수 있다.</p>
<pre><code class="language-javascript">catName(&quot;철수&quot;)

function catName(name) {
    console.log(&#39;고양이 이름은&#39; + name + &#39;입니다.&#39;)
}

// output : 고양이 이름은 철수 입니다.</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[useState작성시 오류 | [object,Object]]]></title>
            <link>https://velog.io/@everyone_joy/useState%EC%9E%91%EC%84%B1%EC%8B%9C-%EC%98%A4%EB%A5%98-objectObject</link>
            <guid>https://velog.io/@everyone_joy/useState%EC%9E%91%EC%84%B1%EC%8B%9C-%EC%98%A4%EB%A5%98-objectObject</guid>
            <pubDate>Fri, 04 Nov 2022 08:49:14 GMT</pubDate>
            <description><![CDATA[<p><em>만약 더미데이터를 만든다고 한다면 변수 안의 key이름을 처음에는 대문자로 할 건지, 소문자로 할 건지 서버 계발자분들과 이야기해서 맞춰야 한다.</em></p>
<blockquote>
<h2 id="오류1">오류1</h2>
</blockquote>
<ol>
<li><p>input창에 글자를 입력하는 순간
<img src="https://velog.velcdn.com/images/everyone_joy/post/dff79b0b-128b-49db-8af1-ec15df22e257/image.png" alt=""></p>
</li>
<li><p>[object, Object]로 바뀌었다..!
<img src="https://velog.velcdn.com/images/everyone_joy/post/cf66de3f-3091-4a9f-9fb2-fb5ca3848bed/image.png" alt=""></p>
</li>
</ol>
<ul>
<li>이런 경우 어디선가 문자열이 배열로 바뀌고 있다는 것이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/36e4e452-ea68-4774-8f7f-234df01f7694/image.png" alt=""> <span style="color : gray">너무 단순한 실수,,,</span> <code>setText</code>자리에 <code>onChangeText</code>로 적혀있었다.. 🤦‍♀️
(이런 실수가 처음이라 저 오류를 한번도 본적이 없었다..놀람쓰..)</p>
<p><br><br></p>
<h3 id="📝-수정부분">📝 <strong>수정부분</strong></h3>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/f556ff8a-b47f-4fda-97dd-4e1afa00aeef/image.png" alt=""></p>
<br>

<h3 id="📝-수정화면">📝 <strong>수정화면</strong></h3>
<p><img src="https://velog.velcdn.com/images/everyone_joy/post/d44703ca-2d16-4c2d-a385-0df0363ebcd9/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[콜백 함수(Callback)]]></title>
            <link>https://velog.io/@everyone_joy/%EC%BD%9C%EB%B0%B1-%ED%95%A8%EC%88%98Callback-3mqko6f5</link>
            <guid>https://velog.io/@everyone_joy/%EC%BD%9C%EB%B0%B1-%ED%95%A8%EC%88%98Callback-3mqko6f5</guid>
            <pubDate>Thu, 03 Nov 2022 14:31:32 GMT</pubDate>
            <description><![CDATA[<h1 id="4-콜백-함수">4. 콜백 함수</h1>
<h2 id="1--콜백함수란">1 . 콜백함수란?</h2>
<hr>
<p>&#39;Call&#39; : 부르다, 호출(실행)하다. &#39;back&#39; : 뒤돌아오다, 되돌다 <br>
<strong>되돌아 호출해달라</strong> 라는 뜻! 어떤 함수X를 호출하면서 &#39;특정 조건일 때, 함수Y를 실행해서 알려달라&#39;
<br>
이 요철을 받은 함수X는 해당 조건이 갖춰졌는지 여부를 판단 한 후 함수Y를 직접 호출한다.</p>
<span style="color: green">
다른 함수의 인자로서 사용되는 함수<br>
어떤 이벤트에의해 호출되어지는 함수 
</span>

<blockquote>
<p>이처럼 콜백함수는 다른 코드(함수or메서드)에게 <strong>인자</strong>로 남겨줌으로써 그 제어권도 함께 위임하는 함수이다. 콜백함수를 위임받은 코드는 자체적인 내부 로직에 의해 이 콜백함수를 적절한 시점에 실행한다.</p>
</blockquote>
<hr>
<br>
<br>

<h2 id="2--제어권">2 . 제어권</h2>
<hr>
<h3 id="span-stylecolor-blue-4-2-1-호출시점-span"><span style="color: blue"> 4-2-1 호출시점 </span></h3>
<pre><code class="language-javascript">    var count = 0;
    var timer = setInterval(function() {
        console.log(count);
        if(++count &gt; 4) clearInterval(timer)
    },300)</code></pre>
<pre><code class="language-java">var intervalID = scope.setInterval(func, delay[, param1, param2, ...])</code></pre>
<p><strong>setInterval()의 구조</strong> <br>
scope : 스코프에는 window객체, worker의 인스턴스가 들어올 수 있다.
func은 함수이고, delay는 밀리초(ms) 단위의 숫자. 세 번째부터는 선택적인데 func함수를 실핼 때 매개변수로 전달할 인자이다. 
<br>
setInterval를 실행하면 반복적으로 실행되는 내용자체를 특정할 수 있는 고유한 ID값으로 반환된다.<br>
<code>timer</code>의 ID를 int형태로 반환함!
<br>
<em>다른 예제</em>
<br></p>
<pre><code class="language-javascript">    var count = 0;
    var cbFunc = function() {
        console.log(count)
        if(++count &gt; 4) clearInterval(timer)
    }

    var timer = setInterval(cbFunc, 300)</code></pre>
<ul>
<li><code>timer</code>변수에는 setInterval의 ID 값이 담긴다.</li>
<li><code>setInterval</code>에 전달한 첫 번째 인자인 cbFunc함수(<strong>이 함수가 곧 콜백함수이다</strong>)는 0.3초마다 자동으로 실행된다.</li>
<li>콜백 함수의 내부에서는 count값을 출력하고, count + 1를 한 다음 값이 4보다 크면 반복 실행을 종료하라고 한다.</li>
</ul>
<br>
<br>
<br>


<h3 id="span-stylecolor-blue--4-2-2-인자"><span style="color: blue">  4-2-2 인자</h3>
<p>예제)</p>
<pre><code class="language-javascript">    var newArr = [10,20,30].map(function(currentValue, index) {
        console.log(currentValue, index)
        return currentValue + 5;
    })

    console.log(newArr)

    // output
    // 10 0
    // 20 1
    // 30 2
    // [15,25,35]</code></pre>
<br>
<br>


<h3 id="map함수의-작동원리를-먼저-알아보자"><strong>map함수의 작동원리를 먼저 알아보자</strong></h3>
<pre><code class="language-javascript">    Array.prototype.map(callback[, thisArg])
    Callback : function(currentValue, index, array)</code></pre>
<ul>
<li>map 메서드는 첫 번째 인자로 callback함수를 받는다.</li>
<li>생략이 가능한 두 번째 인자로 콜백 함수 내부에서 this로 인식할 대상을 특정할 수 있다.<br>
(thisArg를 생략할 경우에는 일반적인 함수와 마찬가지로 전역객체가 바인딩된다.)</li>
<li>첫 번째 인자에는 배열 요소 중 현재값, 두 번째 인자에는 현재값의 인덱스, 세 번째 인자에는 map메서드의 대상이 되는 배열 자체가 담긴다.</li>
</ul>
<br>
<br>
<br>

<p><em>예제 설명으로 다시 돌아가자면</em></p>
<ul>
<li>배열 [10,20.30]의 각 요소를 처음부터 하나씩 꺼내어 콜백함수를 실행한다.</li>
<li>첫 번째 (인덱스 0)에 대한 콜백함수는 currentValue에 10, index는 0이 담긴 채 실행된다.</li>
<li>위 2개의 값을 출력한 다음 15(10 + 5)를 반환한다.</li>
</ul>
<p>이렇게 세 번째 배열까지 실행된 후 return값 ([15,25,35])이 나오게 된다.</p>
<br>
<br>
<br>


<br>
<br>

<h2 id="3-콜백함수는-함수다">3. 콜백함수는 함수다.</h2>
<hr>
<p>&#39;콜백함수는 함수이다&#39; 당연한 말이지만 의미를 좀더 생각해보자. <strong>콜백함수로 어떤 객체의 메서드를 전달하더라도 그 메서드는 메서드가 아닌 함수로서 호출된다.</strong></p>
<p>예제) 메서드를 콜백함수로 전달한 경우</p>
<pre><code class="language-javascript">    var obj = {
        vals : [1,2,3] ,
        logValues : function(v,i) {
            console.log(this, v, i)
        }
    };

obj.logValues(1,2);
    // output : {vals: [1,2,3] , logValues: f} 1 2


[4,5,6].forEach(obj.logValues)
    // forEach의 콜백함수로 전달
    // output : Window { ... } 4 0
    // output : Window { ... } 5 1
    // output : Window { ... } 6 2</code></pre>
<ul>
<li><p>obj객체의 logValues는 메서드로 정의되었다.</p>
</li>
<li><p>151번줄은 이 메서드 이름 앞에 점이 있으니 메서드로서 호출한 것이다.
따라서 this는 obj를 가리키고, 인자로 넘어온 1,2가 출력된다.</p>
<br>
</li>
<li><p>155번줄은 forEach의 콜백함수로써 전달했다.</p>
</li>
<li><p>obj를 this로 하는 메서드를 그대로 전달한 것이 아니라, obj.logValues가 <span style="color: yellow"><strong>가리키는 함수만 전달한 것</strong></span>이다.</p>
</li>
<li><p>이 함수는 obj와 직접적인 연관이 없어진다.</p>
</li>
<li><p>forEach에 의해 콜백이 함수로서 호출되고, 별도로 this를 지정하는 인자를 지정하지 않았음으로 함수 내부에서의 this는 전역객체를 바라보게 된다.</p>
</li>
</ul>
<br>

<blockquote>
<p>어떤 함수의 인자에 객체의 메서드를 전달하더라도 이는 결국 메서드가 아닌 함수일 뿐입니다. 이 차이를 정확히 이해하는 것이 중요!!!</p>
</blockquote>
<hr>
<p><br><br><br></p>
<h2 id="콜백-함수-내부의-this에-다른-값-바인딩하기">콜백 함수 내부의 this에 다른 값 바인딩하기</h2>
<hr>
<p><strong>Q. 콜백 함수 내부에서 this가 객체를 바라보게 하고 싶다면 어떤 방법이 있을까?</strong>
<br>
전통적으로 this를 다릉 변수에 담아 콜백 함수로 활용할 함수에서는 this대신 그 변수를 사용하게 되고, 이를 클로저로 만드는 방식이 많이 쓰였다.</p>
<p><br><br></p>
<p>예제1) 콜백 함수 내부의 this에 다른 값을 바인딩하는 방법(1) - 전통적인 방식</p>
<pre><code class="language-javascript">    var obj1 = {
        name : &#39;obj1&#39;,
        func : function() {
            var self = this;
            return function() {
                console.log(self.name)
            };
        }
    };

    var callback = obj1.func();
    setTimeout(callback, 1000);</code></pre>
<ul>
<li><p>198번 줄에서 obj1.func를 호출하면 앞서 선언한 내부함수가 반환되어 callback변수에 담긴다.</p>
</li>
<li><p>199번 줄에서 이 callback을 setTimeout함수에 인자로 전달하면 1초(1000ms) 뒤 callback이 실행되면서 &#39;<code>obj1</code>&#39;을 출력한다.</p>
<br>
<br>



</li>
</ul>
<p>  <em>하지만 이 방식은 실제로 this를 사용하지도 않고 번거롭기도 하다. 다음 게시글에서 콜백함수 내부에서 this를 좀더 살펴보자!</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Redux의 action]]></title>
            <link>https://velog.io/@everyone_joy/Redux%EC%9D%98-action</link>
            <guid>https://velog.io/@everyone_joy/Redux%EC%9D%98-action</guid>
            <pubDate>Tue, 01 Nov 2022 16:08:58 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="action">Action</h2>
</blockquote>
<p>주문서 같은 개념이다.
만약 true 값을 false값으로 바꾼다던지, user.name을 &#39;철수&#39;에서 &#39;길동&#39;으로 바꿀 때 변경할 내용을 적는 곳이다.</p>
<hr>
<pre><code class="language-javascript">
// 초기 state
const initialState = {
    user : {
        isLoggedIn : false,
        user: null,
        signUpData: {},
        loginData: {},
    }
};</code></pre>
<ul>
<li>로그인을 했을 때 state값을 <code>true</code> 하고, 로그아웃을 했을 때 <code>false</code>로 값이 변경되는 동작을 만들어 보자.<br>



</li>
</ul>
<ul>
<li>주문서(action)을 만들어 주면 된다. 이 action또한 <code>함수형</code>으로 만들 수 있다!</li>
</ul>
<pre><code class="language-javascript">export const loginAction = (data) =&gt; {
    return{
        type: &#39;LOG_IN&#39;,
          data,
    }
}</code></pre>
<blockquote>
<p>여기서 기억해야 할 2가지!
    1. type은 action의 이름이다.
    2. return문을 왜 {} 로 적는가?</p>
</blockquote>
<h3 id="return문을-왜--로-적는가">return문을 왜 {} 로 적는가?</h3>
<p>{} === {} 의 결과는 false로 나온다. 왜냐하면 같은 모양이더라도 각자 개인의 주소를 가지고 있기 때문이다. 모양이 같다고, 객체 안에 프로퍼티가 둘 다 없다고 해도 다르다!</p>
<p>redux는 github처럼 이전 코드를 다시 가져올 수 있다는 장점이 있다. 이전 코드들을 다시 불러 올 수가 있다. 배포를 하기 전 이전 코드와는 오류가 안나는지 확인해볼 수 있는 기회를 가질 수 있다.</p>
<h4 id="만약">만약</h4>
<pre><code class="language-java">const a = {name : &quot;코난&quot;};
const b = a;

b.name = &quot;미란&quot;</code></pre>
<p>으로 한다면 a.name도 &#39;미란&#39;으로 변할 것이다.
그러면 이전 코드가 어땠는지, 값이 무엇이었는지 알 수 없다. 그렇기 때문에 return문에 {} 넣어 이전 코드를 참조할 수 있도록 해주는 것이다.</p>
<pre><code class="language-java">const prev = {name : &quot;코난&quot;}
const next = {name : &quot;미란&quot;}</code></pre>
<p>이렇게 해야 기록에 남는다.</p>
<h3 id="그렇기-때문에-return문에-로-만드는-것이다">그렇기 때문에 return문에 {}로 만드는 것이다.</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[Redux Dev Tools 사용법]]></title>
            <link>https://velog.io/@everyone_joy/Redux-Dev-Tools-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@everyone_joy/Redux-Dev-Tools-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Tue, 01 Nov 2022 10:37:40 GMT</pubDate>
            <description><![CDATA[<p>chrome에서 redux dev tools를 설치해도 안 나오는 경우가 있었다.
그럴 때에는</p>
<p><br><br></p>
<blockquote>
<h4 id="1-터미널에서">1. 터미널에서</h4>
</blockquote>
<pre><code>npm install redux-devtools-extension --save
yarn add redux-devtools-extension --save</code></pre><p><span style="font-size:70%">(각자 사용하는 패키지로)</span> 설치해주고</p>
<blockquote>
<h4 id="2-createstore을-선언하는-파일에">2. createStore을 선언하는 파일에</h4>
</blockquote>
<pre><code class="language-javascript">import { composeWithDevTools } from &#39;redux-devtools-extension&#39;;</code></pre>
<p>임폴트를 하고</p>
<blockquote>
</blockquote>
<h4 id="3-추가해주면-된다">3. 추가해주면 된다.</h4>
<pre><code class="language-javascript">const store = createStore(rootReducer,composeWithDevTools());</code></pre>
<p><br><br></p>
<p>그럼 처음에는 안 나오는 창이 나오게 된다!!
<img src="https://velog.velcdn.com/images/everyone_joy/post/dc9ed7dc-30bf-4d51-ab01-29436a13da79/image.png" alt=""></p>
<p><br><br><br></p>
<p><em>구글링 해보니 여러 방법들이 나와있지만 이 방법이 제일 간단한 것 같다!</em></p>
<p>출처 : <a href="https://seungyooon.tistory.com/83">https://seungyooon.tistory.com/83</a></p>
]]></description>
        </item>
    </channel>
</rss>