<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>woo-dang-tangx2</title>
        <link>https://velog.io/</link>
        <description>Hello world</description>
        <lastBuildDate>Fri, 11 Nov 2022 05:54:02 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>woo-dang-tangx2</title>
            <url>https://images.velog.io/images/kimhyesu-_-/profile/5273e2d9-0dac-4a89-a762-b61ab1653d51/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. woo-dang-tangx2. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kimhyesu-_-" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[알고리즘]콜라 문제]]></title>
            <link>https://velog.io/@kimhyesu-_-/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%BD%9C%EB%9D%BC-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@kimhyesu-_-/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%BD%9C%EB%9D%BC-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Fri, 11 Nov 2022 05:54:02 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가?</p>
</blockquote>
<p>단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.</p>
<blockquote>
<p>문제를 풀던 상빈이는 콜라 문제의 완벽한 해답을 찾았습니다. 상빈이가 푼 방법은 아래 그림과 같습니다. 우선 콜라 빈 병 20병을 가져가서 10병을 받습니다. 받은 10병을 모두 마신 뒤, 가져가서 5병을 받습니다. 5병 중 4병을 모두 마신 뒤 가져가서 2병을 받고, 또 2병을 모두 마신 뒤 가져가서 1병을 받습니다. 받은 1병과 5병을 받았을 때 남은 1병을 모두 마신 뒤 가져가면 1병을 또 받을 수 있습니다. 이 경우 상빈이는 총 10 + 5 + 2 + 1 + 1 = 19병의 콜라를 받을 수 있습니다.
<img src="https://velog.velcdn.com/images/kimhyesu-_-/post/987ac03a-d26d-436a-96d0-e884b7a0b240/image.png" alt=""></p>
</blockquote>
<blockquote>
<p>문제를 열심히 풀던 상빈이는 일반화된 콜라 문제를 생각했습니다. 이 문제는 빈 병 a개를 가져다주면 콜라 b병을 주는 마트가 있을 때, 빈 병 n개를 가져다주면 몇 병을 받을 수 있는지 계산하는 문제입니다. 기존 콜라 문제와 마찬가지로, 보유 중인 빈 병이 a개 미만이면, 추가적으로 빈 병을 받을 순 없습니다. 상빈이는 열심히 고심했지만, 일반화된 콜라 문제의 답을 찾을 수 없었습니다. 상빈이를 도와, 일반화된 콜라 문제를 해결하는 프로그램을 만들어 주세요.</p>
</blockquote>
<blockquote>
<p>콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b, 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/24f3dc9d-c468-41a6-9813-ff0cf586a5b9/image.jpg" alt=""></p>
<hr>
<h2 id="📜문제-풀이">📜문제 풀이</h2>
<p><em>아리까리 그 잡채였던 알고리즘 ㅠㅠ...</em> 다른 분들 풀이를 보고 이해를 했다는...^^(씁쓸..)</p>
<ul>
<li>마트에 주는 빈 병 a , 마트에서 주는 콜라 병 b, 상빈이가 가진 빈 병n</li>
<li>1 ≤ b &lt; a ≤ n ≤ 1,000,000</li>
</ul>
<blockquote>
<pre><code>function solution(a, b, n) {
    let result = 0
    for(let i=a; i&lt;=n; i+=a) {
        result += b
        n += b
    }
    return result
}</code></pre></blockquote>
<pre><code>
&gt; ```
function solution(a, b, n) {
    let result = 0;
&gt;
    while (a &lt;= n) {
        let recycle = Math.floor(n / a) * b;
        result += recycle;
        n = (n % a) + recycle;
    }
&gt;
    return result;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘]김서방 찾기]]></title>
            <link>https://velog.io/@kimhyesu-_-/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EA%B9%80%EC%84%9C%EB%B0%A9-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@kimhyesu-_-/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EA%B9%80%EC%84%9C%EB%B0%A9-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Tue, 08 Nov 2022 15:13:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/d19695e1-01f3-468a-af97-833e0afbb144/image.jpg" alt=""></p>
<hr>
<h2 id="💚문제-풀이">💚문제 풀이</h2>
<blockquote>
<pre><code>function solution(seoul) {
   for(let i=0; i&lt;=seoul.length; i++){
       if(seoul[i] === &quot;Kim&quot;){
           return `김서방은 ${i}에 있다`
       }
   }
}</code></pre></blockquote>
<pre><code>
&lt;br&gt;&lt;br&gt;

&gt; ```
function solution(seoul) {
    let kim = seoul.indexOf(&quot;Kim&quot;)
    return `김서방은 ${kim}에 있다`
}</code></pre><br>

]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘]최소직사각형]]></title>
            <link>https://velog.io/@kimhyesu-_-/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%B5%9C%EC%86%8C%EC%A7%81%EC%82%AC%EA%B0%81%ED%98%95</link>
            <guid>https://velog.io/@kimhyesu-_-/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%B5%9C%EC%86%8C%EC%A7%81%EC%82%AC%EA%B0%81%ED%98%95</guid>
            <pubDate>Sat, 05 Nov 2022 17:34:54 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/32fd1039-b962-4bdb-b6d3-917d0d4c6e9f/image.gif" alt=""></p>
<p><em>이번 알고리즘은 문제부터 어려워서 다른분들 정리한거 읽으면서 이해했따능&gt;</em>&lt; 데헷큥! 구글링을 하다보면 천재님들이 참 많다! 쌍따봉과 박수갈채를 보냅니다👏🏻👏🏻</p>
<p><br><br></p>
<hr>
<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/077165f8-1269-42bc-bc0e-f953ff5e224b/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/kimhyesu-_-/post/8f04ba3c-d914-4cbd-b302-1b6a1de29a87/image.jpg" alt=""></p>
<hr>
<h3 id="😊문제-풀이">😊문제 풀이</h3>
<blockquote>
<pre><code>function solution(sizes) {
    let w = []
    let h = []
</code></pre></blockquote>
<pre><code>for(let i=0; i&lt;sizes.length; i++){
    let max = Math.max(sizes[i][0],sizes[i][1])
    let min = Math.min(sizes[i][0],sizes[i][1])
    w.push(max)
    h.push(min)
}
return Math.max(...w) * Math.max(...h)</code></pre><p>}</p>
<pre><code>
- 가로와 세로를 나타내는 배열을 만들고
- `sizes`의 길이만큼 도는 for문을 작성
- `sizes`의 최대, 최소일 때 값들을 구하고, 가로와 세로를 나타내는 배열에 push를 해준다
- 그리고 `Math.max` 를 통해 가로와 세로의 최댓값을 곱해준다

***
### 😊다른 풀이
&gt; ```
function solution(sizes) {
    let w = 0;
    let h = 0;
    sizes.forEach(s =&gt; {
        const [a, b] = s.sort((a,b) =&gt; a-b);
        if (a &gt; h) h = a;
        if (b &gt; w) w = b;
    });
&gt;
    return w * h;
}</code></pre><br>

<blockquote>
<pre><code>function solution(sizes) {
    const newSizes = sizes.map(e =&gt; e.sort((a, b) =&gt; a - b));
    return Math.max(...newSizes.map(e =&gt; e[0])) * Math.max(...newSizes.map(e =&gt; e[1]));
}</code></pre></blockquote>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘]음양 더하기]]></title>
            <link>https://velog.io/@kimhyesu-_-/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%8C%EC%96%91-%EB%8D%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@kimhyesu-_-/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%8C%EC%96%91-%EB%8D%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 04 Nov 2022 14:13:15 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>문제 설명
어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.</p>
</blockquote>
<blockquote>
<p>제한사항
absolutes의 길이는 1 이상 1,000 이하입니다.
absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
signs의 길이는 absolutes의 길이와 같습니다.
<code>signs[i]</code> 가 참이면 <code>absolutes[i]</code> 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/74778cfe-e187-42ce-9c2e-ec689a0653b2/image.jpg" alt=""></p>
<br>

<hr>
<h3 id="✏️문제-풀이">✏️문제 풀이</h3>
<blockquote>
<pre><code>function solution(absolutes, signs) {
    let sum = 0;
    for(let i=0; i&lt;absolutes.length; i++){
        if(signs[i] === true){
            sum = sum + absolutes[i]
        } else {
            sum = sum - absolutes[i]
        }
    }
    return sum
}</code></pre></blockquote>
<pre><code>
- 맨 처음에 `i&lt;=absolutes.length` 로 작성했는데 계속 에러가 남..등호 주의해야겠다ㅠ

- `absolutes`의 길이만큼 도는 for문을 작성!
- 문제에 나와있듯이 조건에 따른 `if-else` 조건문을 작성! (`signs[i]` 가 참이면 `absolutes[i]` 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.)
&lt;br&gt;&lt;br&gt;

***

### 👀다른 사람의 풀이


1. `reduce()` 메서드 사용

&gt; ```
function solution(absolutes, signs) {
&gt;
    return absolutes.reduce((acc, val, i) =&gt; acc + (val * (signs[i] ? 1 : -1)), 0);
}</code></pre><br>

<ol start="2">
<li><code>삼항연산자</code> 사용</li>
</ol>
<blockquote>
<pre><code>function solution(absolutes, signs) {
    let answer = 0;
    for (let i = 0; i &lt; absolutes.length; i++) {
        signs[i] ? answer += absolutes[i] : answer -= absolutes[i]
    }
    return answer;
}</code></pre></blockquote>
<p>```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘]약수의 개수와 덧셈]]></title>
            <link>https://velog.io/@kimhyesu-_-/%EC%BD%94%ED%85%8C%EC%97%B0%EC%8A%B5%EC%95%BD%EC%88%98%EC%9D%98-%EA%B0%9C%EC%88%98%EC%99%80-%EB%8D%A7%EC%85%88</link>
            <guid>https://velog.io/@kimhyesu-_-/%EC%BD%94%ED%85%8C%EC%97%B0%EC%8A%B5%EC%95%BD%EC%88%98%EC%9D%98-%EA%B0%9C%EC%88%98%EC%99%80-%EB%8D%A7%EC%85%88</guid>
            <pubDate>Wed, 02 Nov 2022 15:49:16 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.</p>
</blockquote>
<blockquote>
</blockquote>
<p>(제한사항)
1 ≤ left ≤ right ≤ 1,000</p>
<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/daacaa3e-ddb4-4281-be3b-0598c54e3c68/image.jpg" alt=""></p>
<br>

<hr>
<h2 id="✏️문제-풀이">✏️문제 풀이</h2>
<blockquote>
<pre><code>function solution(left, right) {
    let result = 0
    for(let i=left; i&lt;=right; i++){
        let divisors = []
        for(let j=1; j&lt;=i; j++){
            if(i%j === 0) divisors.push(j)
        }
        divisors.length % 2 ===0 ? result += i : result -=i
    }
    return result
}</code></pre></blockquote>
<p>```</p>
<br>

<ul>
<li>left~right까지의 숫자를 도는 <code>for문</code>을 작성함</li>
<li>약수들을 담을 배열 <code>divisors</code>를 만듦</li>
<li>1부터 i까지 도는 for문을 하나 더 만들어서 나머지가 0으로 떨어지면 약수 배열에 push를 해줌</li>
<li>약수의 개수가 짝수면 <code>+</code> 를, 홀수면 <code>-</code> 를 함 =&gt; 삼항연산자 활용</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘]부족한 금액 계산하기]]></title>
            <link>https://velog.io/@kimhyesu-_-/%EC%BD%94%ED%85%8C%EC%97%B0%EC%8A%B5%EB%B6%80%EC%A1%B1%ED%95%9C-%EA%B8%88%EC%95%A1-%EA%B3%84%EC%82%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@kimhyesu-_-/%EC%BD%94%ED%85%8C%EC%97%B0%EC%8A%B5%EB%B6%80%EC%A1%B1%ED%95%9C-%EA%B8%88%EC%95%A1-%EA%B3%84%EC%82%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 31 Oct 2022 16:59:13 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.</p>
</blockquote>
<blockquote>
<p>제한사항</p>
</blockquote>
<ul>
<li>놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수</li>
<li>처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수</li>
<li>놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수
<img src="https://velog.velcdn.com/images/kimhyesu-_-/post/069e5b14-d049-4878-8538-3daa103ba4e0/image.jpg" alt=""></li>
</ul>
<br>

<hr>
<h2 id="👀문제-풀이">👀문제 풀이</h2>
<ul>
<li>count 숫자만큼 for문을 돌면서 총 이용금액(totalPrice)에 price*i를 더한다</li>
<li>놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요. 단, 금액이 부족하지 않으면 0을 return 하세요.</li>
</ul>
<blockquote>
<pre><code>function solution(price, money, count) {
    let totalPrice = 0;
    for(let i=1; i&lt;=count; i++){
        totalPrice += price * i
    }
    return money &gt; totalPrice ? 0 : totalPrice-money
}</code></pre></blockquote>
<pre><code>

&lt;br&gt;&lt;br&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘]삼총사]]></title>
            <link>https://velog.io/@kimhyesu-_-/%EC%BD%94%ED%85%8C%EC%97%B0%EC%8A%B5%EC%82%BC%EC%B4%9D%EC%82%AC</link>
            <guid>https://velog.io/@kimhyesu-_-/%EC%BD%94%ED%85%8C%EC%97%B0%EC%8A%B5%EC%82%BC%EC%B4%9D%EC%82%AC</guid>
            <pubDate>Sun, 30 Oct 2022 15:53:49 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.</p>
</blockquote>
<blockquote>
<p>한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/9b41e231-bf34-4570-8891-135ac0b2e64b/image.jpg" alt=""></p>
<p><br><br></p>
<hr>
<h2 id="🐾나의-풀이">🐾나의 풀이</h2>
<ol>
<li>맨 처음에 배열의 합을 더하는 메서드를 찾다가 <code>reduce()</code> 라는 메서드를 찾음<blockquote>
<p><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce</a></p>
</blockquote>
</li>
</ol>
<h3 id="arrayprototypereduce">Array.prototype.reduce()</h3>
<blockquote>
<p>reduce()** <strong>메서드는 배열의 각 요소에 대해 주어진 **리듀서</strong>(reducer) 함수를 실행하고, 하나의 결과값을 반환합니다..</p>
</blockquote>
<blockquote>
<pre><code>const array1 = [1, 2, 3, 4];
</code></pre></blockquote>
<p>// 0 + 1 + 2 + 3 + 4
const initialValue = 0;
const sumWithInitial = array1.reduce(
  (previousValue, currentValue) =&gt; previousValue + currentValue,
  initialValue
);</p>
<blockquote>
</blockquote>
<p>console.log(sumWithInitial);
// expected output: 10</p>
<pre><code>
### _But 계속 에러가 남^^...._ =&gt; 다른 방법 찾기 ㄱㄱ

&lt;br&gt;&lt;br&gt;
2. 냅다 `if문` ㄱㄱ

&gt; ```
function solution(number) {
    let arr = [0,0,0,0,0]
    if(number.length &lt;= 13) {
        return 5
    }
}</code></pre><h3 id="🤩3가지-테스트-중-테스트2는-통과함">🤩3가지 테스트 중 테스트2는 통과함!</h3>
<p>그러나... 이 이상 문제를 어떻게 풀어 나가야 할지 생각이나질 않았다...
그래서 가장 익숙한 <code>for문</code>을 사용해봄</p>
<blockquote>
<pre><code>function solution(number) {
    let sum = 0
    if(number.length &lt;= 13) {
        return 5
    } 
    for(let i=0; i&lt;number.length; i++){
        for(let j=i+1; j&lt;number.length; j++){
        } sum += 1;
    }
    return sum
}</code></pre></blockquote>
<pre><code>
### 역시나... ERROR ^^
구글의 도움으로 다른 분들의 정답을 보고 풀 수 있었다고 한다..

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

***

## &lt;정답 코드&gt;
&gt; ```
function solution(number) {
    let sum = 0
    for(let i=0; i&lt;number.length; i++){
        for(let j=i+1; j&lt;number.length; j++){
            for(let k=j+1; k&lt;number.length; k++){
                if(number[i]+number[j]+number[k]===0){
                    sum += 1
                }
            }
        }
    }
    return sum
}</code></pre><ul>
<li>삼총사가 될 수 있는 경우의 수를 <code>sum</code>(배열의 3가지 요소 더해서 0이 되는 경우)</li>
<li><code>number</code>의 요소 세가지를 더해야 하니까 for문 3개를 중첩시킴</li>
</ul>
<br>

]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘]나머지가 1이 되는 수 찾기]]></title>
            <link>https://velog.io/@kimhyesu-_-/%EC%BD%94%ED%85%8C%EC%97%B0%EC%8A%B5%EB%82%98%EB%A8%B8%EC%A7%80%EA%B0%80-1%EC%9D%B4-%EB%90%98%EB%8A%94-%EC%88%98-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@kimhyesu-_-/%EC%BD%94%ED%85%8C%EC%97%B0%EC%8A%B5%EB%82%98%EB%A8%B8%EC%A7%80%EA%B0%80-1%EC%9D%B4-%EB%90%98%EB%8A%94-%EC%88%98-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Fri, 28 Oct 2022 03:06:15 GMT</pubDate>
            <description><![CDATA[<h2 id="나머지가-1이-되는-수-찾기">나머지가 1이 되는 수 찾기</h2>
<br>

<h3 id="✏️문제-설명">✏️문제 설명</h3>
<blockquote>
<p>자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다.</p>
</blockquote>
<blockquote>
<p>제한사항
3 ≤ n ≤ 1,000,000</p>
</blockquote>
<blockquote>
<p>입출력 예
n    result
10    3
12    11</p>
</blockquote>
<blockquote>
</blockquote>
<p>입출력 예 설명
입출력 예 #1
10을 3으로 나눈 나머지가 1이고, 3보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 3을 return 해야 합니다.</p>
<blockquote>
<p>입출력 예 #2
12를 11로 나눈 나머지가 1이고, 11보다 작은 자연수 중에서 문제의 조건을 만족하는 수가 없으므로, 11을 return 해야 합니다.</p>
</blockquote>
<hr>
<h2 id="👀나의-풀이-과정">👀나의 풀이 과정</h2>
<ul>
<li>나머지가 1 이어야하고 (n%x ===1)</li>
<li>n은 숫자 3 이상</li>
<li>n%x를 했을 때 나머지가 가장 작은 수 x를 return 해야함<br>

</li>
</ul>
<blockquote>
<pre><code>function solution(n) {
    for(let x=2; x&lt;n; x++){
        if(n%x===1) return x
    }
}
</code></pre></blockquote>
<p>//n은 최솟값이 3이고 나머지가 1이 돼야하니까 x=2를 기본값으로 설정하고 for문을 돌림. 
//x=0해도 테스트 통과됨!</p>
<p>```</p>
<p><br><br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[useParams와 useSearchParams ]]></title>
            <link>https://velog.io/@kimhyesu-_-/useParams%EC%99%80-useSearchParams</link>
            <guid>https://velog.io/@kimhyesu-_-/useParams%EC%99%80-useSearchParams</guid>
            <pubDate>Sun, 25 Sep 2022 09:58:23 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/7e177016-6bce-4472-93e8-a15678702f98/image.gif" alt="">
냅다 즐거워보이는 짤로 시작하기🤗
요즘 혼자서 미니프로젝트를 하고 있는데 여기서 처음 접한 useParams와 useSearchParams를 정리해보겠다(당당)</p>
<p><br><br></p>
<h1 id="🔎일단-useparams가-뭐냐묘온">🔎일단 useParams가 뭐냐묘온~</h1>
<p>&lt;출처-<a href="https://reactrouter.com/en/main/hooks/use-params&gt;">https://reactrouter.com/en/main/hooks/use-params&gt;</a></p>
<blockquote>
<p>useParams후크는 에 의해 일치된 현재 URL에서 동적 매개변수의 키/값 쌍의 객체를 반환 합니다 <Route path>. 자식 경로는 부모 경로에서 모든 매개변수를 상속합니다.</p>
</blockquote>
<p>  (말이 조금 어색해보이는건 영어로 소개된걸 냅다 구글 번역기로 바꿨기 때문^^)</p>
<blockquote>
<pre><code>import * as React from &#39;react&#39;;
import { Routes, Route, useParams } from &#39;react-router-dom&#39;;
</code></pre></blockquote>
<p>function ProfilePage() {
  // Get the userId param from the URL.
  let { userId } = useParams();
  // ...
}</p>
<blockquote>
</blockquote>
<p>function App() {
  return (
    <Routes>
      <Route path="users">
        &lt;Route path=&quot;:userId&quot; element={<ProfilePage />} /&gt;
        <Route path="me" element={...} />
      </Route>
    </Routes>
  );
}</p>
<pre><code>
위의 예시처럼 사용하면 된다고 한다. _어렵Neo.._💧💧💦

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

  ### 프로젝트에서 `useParams` 사용한 코드로 다시 보자🙂 


&gt; ```
const ProductDetail = () =&gt; {
  let { id } = useParams();
  const [product, setProduct] = useState(null);
  const getProductDetail = async () =&gt; {
    let url = `http://localhost:5000/products/${id}`;
    let response = await fetch(url);
    let data = await response.json();
    console.log(data);
    setProduct(data);
  };</code></pre><ul>
<li><p>일단 위 페이지는 상품 상세페이지이다. 미리 만들어 둔 <code>db.json</code> 에 있는 아이템들의 <code>id</code>값을 읽어와야함</p>
</li>
<li><p><code>id</code>는 동적인 값을 읽을 수 있어야해서 템플릿리터럴 형식!</p>
</li>
<li><p>공식 문서 코드 예시처럼 useParams를 선언함(<code>let {id} = useParams()</code>)</p>
</li>
<li><p>let url = <code>http://localhost:5000/products/${id}</code>;
  =&gt; id 값에 해당하는 아이템을 들고옴</p>
<br>

</li>
</ul>
<hr>
<h1 id="🔎usesearchparams란">🔎useSearchParams란?</h1>
<p>**  =&gt; url에서 쿼리값을 가져오는 함수**</p>
<blockquote>
<p>useSearchParams후크는 현재 위치에 대한 URL의 쿼리 문자열을 읽고 수정하는 데 사용됩니다 . React의 useState후크 useSearchParams 와 마찬가지로 현재 위치의 검색 매개변수와 이를 업데이트하는 데 사용할 수 있는 함수라는 두 가지 값의 배열을 반환합니다 . React의 useStatehook 과 마찬가지로 기능 업데이트 setSearchParams 도 지원합니다. 따라서 업데이트된 버전을 가져와 반환하는 함수를 제공할 수 있습니다.</p>
</blockquote>
<blockquote>
<pre><code>import * as React from &quot;react&quot;;
import { useSearchParams } from &quot;react-router-dom&quot;;
</code></pre></blockquote>
<p>function App() {
  let [searchParams, setSearchParams] = useSearchParams();</p>
<blockquote>
</blockquote>
<p>  function handleSubmit(event) {
    event.preventDefault();
    // The serialize function here would be responsible for
    // creating an object of { key: value } pairs from the
    // fields in the form that make up the query.
    let params = serializeFormQuery(event.target);
    setSearchParams(params);
  }</p>
<blockquote>
</blockquote>
<p>  return (
    <div>
      <form onSubmit={handleSubmit}>{/* ... */}</form>
    </div>
  );
}</p>
<pre><code>

 **_ 오..어렵Neo..222...._**💧💦💧💦
  &lt;br&gt;

**  난 `useSearchParams`를 검색창에 검색하는 기능에 사용을했다. 코드를 통해 알아보자 ㄱㄱ**
  &lt;br&gt; 


&gt;   ```
  const [productList, setProductList] = useState([]);
  const [query, setQuery] = useSearchParams();
  const getProducts = async () =&gt; {
    let searchQuery = query.get(&quot;q&quot;) || &quot;&quot;; //=&gt;q로 시작하는 아이템을 가져와서 searchQuery에 넣어줘라. 값이 없으면 빈 스트링을 넣어주겠다
    console.log(&quot;쿼리값은?&quot;, searchQuery);
    let url = `http://localhost:5000/products?q=${searchQuery}`;
    let response = await fetch(url);
    let data = await response.json();
    setProductList(data);
  };
&gt;

  - `const [query, setQuery] = useSearchParams();` 
  =&gt; 먼저 useSearchParams를 선언한다.
  -  `let searchQuery = query.get(&quot;q&quot;) || &quot;&quot;;`
  =&gt; q로 시작하는 아이템을 가져와서 searchQuery에 넣어줘라. 값이 없으면 빈 스트링을 넣어주겠다.
  -  let url = `http://localhost:5000/products?q=${searchQuery}`;
###  ✨_검색창(`input`)에 &#39;와이드&#39; 라고 입력하면 url 쿼리 부분이 와이드로 바뀐것을 확인할 수 있다._✨

 ![](https://velog.velcdn.com/images/kimhyesu-_-/post/7d114dbf-3fed-4d7c-9689-1e579fe2c23d/image.png)

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

  - 이제 url이 변경되는 것은 확인을 했으니 화면에 보여줘야함.
  - `useEffect`를 사용해서 `query`값이 바뀔 때마다 화면에 바뀐 값을 보여준다


&gt;   ```
  useEffect(() =&gt; {
    getProducts();
  }, [query]); //query값이 바뀔때마다 화면에 보여줘!</code></pre><p>  <br><br></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[lifecycle(class형/함수형)]]></title>
            <link>https://velog.io/@kimhyesu-_-/lifecycleclass%ED%98%95%ED%95%A8%EC%88%98%ED%98%95</link>
            <guid>https://velog.io/@kimhyesu-_-/lifecycleclass%ED%98%95%ED%95%A8%EC%88%98%ED%98%95</guid>
            <pubDate>Tue, 30 Aug 2022 07:26:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/f72bdf81-3ef7-4873-a33b-d2d8014d53d5/image.gif" alt=""></p>
<h3 id="먼저-나의-근황-한-스푼🥄">먼저 나의 근황 한 스푼~🥄</h3>
<p>부트캠프 수료 이후, 같은 포지션(FE)인 동기들 몇명과 함께 스터디를 진행 중이다. 오늘이 마침 온라인 회의를 하는 날이었는데 라이프사이클이 꽤나 중요한 주제이고 면접에서도 종종 나온다고 했다. 하지만 단번에 이해가 될 내용이 아니었다? 
sks..나..난 천재가 아니라느뇽..! 난 한번에 이해를 할 수 없었다^^...
그래서 따로 정리를 해보겠다(당당) 
라이프사이클...
다 외워버려ㅡㅡ 이해해버려ㅡㅡ 👊🏻</p>
<p><br><br></p>
<hr>
<h1 id="🍉-클래스-컴포넌트-liftcycle">🍉 클래스 컴포넌트 liftcycle</h1>
<h2 id="✅mounting---updating---unmounting">✅Mounting - Updating - Unmounting</h2>
<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/85b2e3e0-0a13-4db5-b06d-a76ba137b8d1/image.jpg" alt=""></p>
<p><br><br>
<br></p>
<h2 id="1-mounting">&lt;1. Mounting&gt;</h2>
<ol>
<li><code>contructor</code>: 첫 번째로 실행되는 라이프사이클 함수. <ul>
<li>컴포넌트가 실행될 때 constructor 먼저 호출한다.
(앱이 실행되자마자 해줘야 하는 작업들을 이 곳에 넣는다)</li>
<li>state를 만드는 곳</li>
<li><em>주의사항❗</em> 
<code>constructor()</code> 내부에서 <code>setState()</code>를 호출하면 안 됩니다.
 컴포넌트에 지역 state가 필요하다면 생성자 내에서 this.state
에 초기 state 값을 할당하면 됩니다.</li>
</ul>
</li>
</ol>
<br>

<ol start="2">
<li><code>render</code>: UI 그려주는 함수</li>
</ol>
<br>

<ol start="3">
<li><code>componentDidMount</code>: UI가 세팅이 완료되면 우리에게 알려줌
 (&quot;낰낰 UI 준비 완&quot;)
 주로 API를 부른다. 왜냐? render 끝나고 바로 호출되는 함수니까!</li>
</ol>
<p><br><br></p>
<h2 id="2-updating">&lt;2. Updating&gt;</h2>
<ol>
<li><code>render</code>: state가 업데이트 되거나, props가 업데이트 되거나 또는 업데이트가 강요되는 상황일 때! render가 발생한다.</li>
</ol>
<br>

<ol start="2">
<li><code>componentDidUpdate</code>: state가 업데이트 된 후에 해야하는 작업들(ex.counter 값 바뀌는거) </li>
</ol>
<ul>
<li>componentDidUpdate() 는 갱신이 일어난 직후에 호출됩니다. 이 메서드는 최초 렌더링에서는 호출되지 않습니다. (출처-React 공식문서)</li>
</ul>
<p><br><br></p>
<h2 id="3-unmounting">&lt;3. Unmounting&gt;</h2>
<ol>
<li><code>componentWillUnmount</code>: 컴포넌트 마운트 해제됨. 컴포넌트가 사라짐</li>
</ol>
<br>

<hr>
<p><br><br></p>
<h1 id="🍉함수형-컴포넌트-liftcycle">🍉함수형 컴포넌트 liftcycle</h1>
<h2 id="🎶useeffect">🎶useEffect</h2>
<p><strong>: 매개변수를 두개 받음(콜백함수,배열)</strong></p>
<blockquote>
<pre><code>useEffect(()=&gt;{
    console.log(&quot;useEffect1 Fire&quot;)
},[])
: 배열에 아무것도 없으면 componentDidMount()처럼 작동
    (처음에만 렌더됨)</code></pre></blockquote>
<pre><code>
&lt;br&gt;

&gt; ```
useEffect(()⇒{
console.log(”useEffect2 fire”)
},[counter2]) 
&gt;
: 배열 안에 state가 있으면 componentDidMount()+ componentDidUpdate() 
counter2 값 바뀔때마다 ”useEffect2 fire”</code></pre><br>

<blockquote>
<pre><code>const [value1,setValue1]=useState(0)
const [value2,setValue2]=useState(0)
</code></pre></blockquote>
<p>useEffect(()=&gt;{
    console.log(&quot;hey&quot;)
},[value1,value2])</p>
<blockquote>
</blockquote>
<p>const updateValue =()=&gt;{
    setValue1(1) // 1개의 state만 업데이트 됨
}</p>
<blockquote>
</blockquote>
<p>// 콘솔 결과는 hey 한번만 프린트 됨</p>
<blockquote>
</blockquote>
<p>=========================================================</p>
<blockquote>
</blockquote>
<p>const [value1,setValue1]=useState(0)
const [value2,setValue2]=useState(0) </p>
<blockquote>
</blockquote>
<p>useEffect(()=&gt;{
    console.log(&quot;hey&quot;)
 },[value1,value2]) 
const updateValue =()=&gt;{
    setValue1(1) // 2개의 state가 동시에 업데이트 됨
    setValue2(1)
 }</p>
<blockquote>
</blockquote>
<p>// 콘솔 결과는 hey 한번만 프린트 됨</p>
<pre><code>

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


</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[상태 관리란?]]></title>
            <link>https://velog.io/@kimhyesu-_-/%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%EB%9E%80</link>
            <guid>https://velog.io/@kimhyesu-_-/%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%EB%9E%80</guid>
            <pubDate>Sat, 27 Aug 2022 07:30:15 GMT</pubDate>
            <description><![CDATA[<h1 id="📖상태-관리state-management란">📖상태 관리(State Management)란?</h1>
<p>** : 데이터를 관리하는 방법. 여러 <code>component</code>간에 데이터 전달과 이벤트 통신을 한 곳에서 관리하는 것.**</p>
<p> <br><br></p>
<h2 id="🖐🏻상태-관리가-필요한-이유">🖐🏻상태 관리가 필요한 이유?</h2>
<p>**     1. 데이터가 바뀌어도 페이지가 렌더링 되지 않게 하기 위해
    2. 상태(state)들이 복잡하게 얽혀있다면, 상호간에 의존성이 많아지게 되어서 UI가 어떻게 변하는지 알기 어렵기 때문에 효율적인 관리가 필요하다.**</p>
<p> <br><br></p>
<p><strong>✅상태 관리 라이브러리 종류: <em>redux,MobX,Overmind.js,recoil</em></strong></p>
<p>  <br><br></p>
<hr>
<p>  <br><br></p>
<h2 id="🖐🏻redux의-장점을-알아보자">🖐🏻Redux의 장점을 알아보자</h2>
<blockquote>
<h4 id="1-모든-component가-props-없이-state를-직접-꺼내서-쓸-수-있다">1. 모든 <code>component</code>가 <code>props</code> 없이 <code>state</code>를 직접 꺼내서 쓸 수 있다.</h4>
</blockquote>
<h4 id="2-상태-관리가-용이하다-버그가-나도-추적이-쉬움-버그는-storejs에서-찾으면-됨">2. 상태 관리가 용이하다. (버그가 나도 추적이 쉬움. 버그는 <code>store.js</code>에서 찾으면 됨)</h4>
<p>(출처-유튜브 코딩애플 <a href="https://youtu.be/QZcYz2NrDIs">https://youtu.be/QZcYz2NrDIs</a>)
    <br><br>
    <img src="https://velog.velcdn.com/images/kimhyesu-_-/post/8c88cc95-df9a-41d1-9ffa-b0aa24ec9158/image.png" alt="">
    <img src="https://velog.velcdn.com/images/kimhyesu-_-/post/1a1a792c-2420-4757-af0a-448f0bd9c04b/image.png" alt=""></p>
<p>_&lt;state 관리하는 component에서 state 수정하는 코드(reducer) 작성&gt;_</p>
<p>   <img src="https://velog.velcdn.com/images/kimhyesu-_-/post/780fcc7d-2895-407a-ad7e-d75ff711b117/image.png" alt=""> </p>
<br>

<p>_&lt;component에서 state 수정 요청 할때엔 dispatch 사용&gt;_
  <img src="https://velog.velcdn.com/images/kimhyesu-_-/post/f48ea9f2-ae19-4db1-b2e9-53d4b375fa0c/image.png" alt=""></p>
<p><br><br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React에서 state를 const로 선언하는 이유/이벤트 처리하는 방법]]></title>
            <link>https://velog.io/@kimhyesu-_-/React%EC%97%90%EC%84%9C-state%EB%A5%BC-const%EB%A1%9C-%EC%84%A0%EC%96%B8%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@kimhyesu-_-/React%EC%97%90%EC%84%9C-state%EB%A5%BC-const%EB%A1%9C-%EC%84%A0%EC%96%B8%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Sat, 20 Aug 2022 10:44:29 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/78cd2402-1144-4a45-86bc-cfcd760abdf4/image.gif" alt=""></p>
<p>ㄴ ㅏ 의,, React 기본기 다지기는 끝날 때까지 끝난 것이...아..ㅏ아..니다..</p>
<p>코딩알려주는누나 강의를 듣다 보면 좋은 정보들이 참 많은데 기록하지 않으면 잊어버리니까 벨로그에 정리-⭐(개인 공부하는거임..)</p>
<p><br><br></p>
<h1 id="✅state를-const로-선언하는-이유">✅state를 const로 선언하는 이유?</h1>
<h3 id="✔️example">✔️example</h3>
<blockquote>
<pre><code>const [counter,setCounter] = useState(0)</code></pre></blockquote>
<pre><code>
=&gt; state는 일반 변수와 달리 `setState` 함수를 이용하여 값을 변경한다. (이렇게 함수 내부의 변수가 함수 수명이 끝나더라도, 변수의 참조가 계속된다면 그 변수의 수명은 계속된다. 이것을 `클로저`라고 한다. 이렇게 우린 컴포넌트가 render가 되더라도 state를 기억할 수 있다.

&lt;br&gt;

허나, let을 사용하게되면 `counter2 = 100`과 같은 변수 형식의 할당이 가능해진다. 따라서 이를 방지하고 `setState`를 사용한 변수 변경만 허락하기위해 `const`로 선언한다. (const로 선언하면 변수 형태의 재할당을 막을 수 있다.)

&lt;br&gt;

***

&lt;br&gt;

# ✅이벤트 처리하기
기존에 HTML에서 이벤트를 처리할 때는 함수를 문자열 형태로 전달을 해주었다.

&gt; ```
&lt;button onclick=&quot;activateLasers()&quot;&gt;
    Activate Lasers
&lt;/button&gt;</code></pre><br>

<p><code>onClick</code>안에서 HTML에서 전달해 준 것처럼 <code>activateLasers()</code> 이렇게 전달을 하면 이는 함수를 실행하는 문장이기 때문에 이벤트가 발생하지 않았음에도 불구하고 처음에 render 시 바로 호출되버린다. 따라서 ⭐<strong>함수를 콜백형태로 전달해 주는 것이 중요하다.</strong>⭐</p>
<br>

<h3 id="✔️전달해-줄-매개변수가-있는-경우">✔️전달해 줄 매개변수가 있는 경우</h3>
<blockquote>
<pre><code>&lt;button onClick={()=&gt;activateLasers(&quot;some value&quot;)}&gt;
  Activate Lasers
&lt;/button&gt;</code></pre></blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[⭐git 레파지토리 맨 처음 생성 시]]></title>
            <link>https://velog.io/@kimhyesu-_-/git-%EB%A0%88%ED%8C%8C%EC%A7%80%ED%86%A0%EB%A6%AC-%EB%A7%A8-%EC%B2%98%EC%9D%8C-%EC%83%9D%EC%84%B1-%EC%8B%9C</link>
            <guid>https://velog.io/@kimhyesu-_-/git-%EB%A0%88%ED%8C%8C%EC%A7%80%ED%86%A0%EB%A6%AC-%EB%A7%A8-%EC%B2%98%EC%9D%8C-%EC%83%9D%EC%84%B1-%EC%8B%9C</guid>
            <pubDate>Thu, 18 Aug 2022 15:16:43 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/5647d8bd-90d3-4238-b853-f37a151ee65e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Promise]]></title>
            <link>https://velog.io/@kimhyesu-_-/Promise</link>
            <guid>https://velog.io/@kimhyesu-_-/Promise</guid>
            <pubDate>Mon, 15 Aug 2022 15:24:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/ef74ab15-9f9a-4c3a-a045-f7fc36a1a8d1/image.gif" alt=""></p>
<h3 id="swag-넘치게-ㅅ-ㅣ작"><em>Swag 넘치게 ㅅ ㅣ작~</em></h3>
<p><br><br></p>
<h1 id="✅promise">✅Promise?</h1>
<blockquote>
<p><strong>- 자바스크립트에서 제공하는 비동기를 간편하게 처리할 수 있는 object</strong></p>
</blockquote>
<ul>
<li>정상 수행: 성공메세지와 함께 처리된 결과값을 전달한다.(<code>resolved</code>)</li>
<li>실패: 에러를 전달한다.(<code>rejected</code>)</li>
<li>프라미스는 성공 또는 실패만 한다.</li>
<li>promise 이전에 비동기 통신을 할 때 사용되는 <code>콜백함수</code>의 단점을 보완하기 위해 promise 객체가 생겨나게 됨</li>
</ul>
<br>

<h2 id="😯callback-함수란">😯<em>callback 함수란?</em></h2>
<blockquote>
<p> 특정 함수 내에서 어떤 이벤트가 발생했거나 특정 시점에 도달했을 때 시스템에서 호출하는 함수</p>
</blockquote>
<ul>
<li>콜백 패턴을 사용하여 처리 순서를 보장하기 위해 중첩으로 인한 복잡도가 증가하였다.
(비동기 통신 → 요청 → 응답 → 콜백 함수 수행 → 요청 → 응답 → 콜백함수 수행으로 발생하는 &#39;무한 반복 콜백 현상&#39;이 발생한다.)</li>
<li>어떤 구문에서 에러가 발생하였을 때 에러 위치를 찾기가 어렵다.</li>
<li>예외처리를 하는 데 있어서 어려움을 가지고 있다.</li>
</ul>
<br>
<br>

<h3 id="✔️무한-반복-콜백-현상">✔️무한 반복 콜백 현상</h3>
<blockquote>
<pre><code>// 1초마다 숫자에 10을 더해준다.
const _number10Add = (num, callback) =&gt; {
    setTimeout(() =&gt; {
        callback(num + 10);
    }, 1000);
};
</code></pre></blockquote>
<p>// 1초마다 숫자에 20을 더해준다.
const _number20Add = (num, callback) =&gt; {
    setTimeout(() =&gt; {
        callback(num + 20);
    }, 1000);
};</p>
<blockquote>
</blockquote>
<p>// 1초마다 숫자에 30을 더해준다.
const _number30Add = (num, callback) =&gt; {
    setTimeout(() =&gt; {
        callback(num + 30);
    }, 1000);
};</p>
<blockquote>
</blockquote>
<p>// 결과값을 콘솔에 출력한다.
const _numberLog = (number) =&gt;
    new Promise(() =&gt; {
        setTimeout(() =&gt; console.log(number), 1000);
    });</p>
<blockquote>
</blockquote>
<p>// 최종 연산 값을 출력한다. =&gt; 반복 콜백 문제 발생
const resultConsole = () =&gt; {
    _number10Add(0, (callbackNum1) =&gt; {
        _number20Add(callbackNum1, (callbackNum2) =&gt; {
            _number30Add(callbackNum2, (callbackNum3) =&gt; {
                _numberLog(callbackNum3);
            });
        });
    });
};
resultConsole();</p>
<pre><code>

&lt;br&gt;


### ✔️Promise 함수로 변경한 예시
&gt; ```
// 1초마다 숫자에 10을 더해준다.
const _number10Add = (num) =&gt; {
    return new Promise((resolve) =&gt; {
        setTimeout(() =&gt; {
            resolve(num + 10);
        }, 1000);
    });
};
&gt;
// 1초마다 숫자에 20을 더해준다.
const _number20Add = (num) =&gt; {
    return new Promise((resolve) =&gt; {
        setTimeout(() =&gt; {
            resolve(num + 20);
        }, 1000);
    });
};
&gt;
// 1초마다 숫자에 30을 더해준다.
const _number30Add = (num) =&gt; {
    return new Promise((resolve) =&gt; {
        setTimeout(() =&gt; {
            resolve(num + 30);
        }, 1000);
    });
};
&gt;
// 결과값을 콘솔에 출력한다.
const _numberLog = (number) =&gt;
    new Promise(() =&gt; {
        setTimeout(() =&gt; console.log(number), 1000);
    });
&gt;
// 최종 연산 값을 출력한다.
const resultConsole = () =&gt; {
    _number10Add(0)
        .then((res) =&gt; _number20Add(res))
        .then((res) =&gt; _number30Add(res))
        .then((res) =&gt; _numberLog(res));
};</code></pre><p><br><br></p>
<p><strong>❗여기서 동기, 비동기의 차이란 무엇이냐면</strong></p>
<ul>
<li>동기: 순서대로</li>
<li>비동기: 순서X. 비동기적으로
<em><strong><del>간단 설명 끝</del></strong></em></li>
</ul>
<p><br><br></p>
<h3 id="그런데-왜--ㅇㅙwhy-비동기적인-처리가-필요할까">그런데 왜 ? ?ㅇㅙ,,wHy,, 비동기적인 처리가 필요할까???</h3>
<p>ex) youtube 켬-&gt; 데이터 불러오는 약 2초동안 화면에 아무것도 안뜸-&gt;사용자 입장에선 불편함😑..</p>
<h3 id="-비동기적인-처리가-필요함">=&gt; 비동기적인 처리가 필요함</h3>
<p><br><br><br></p>
<hr>
<p><br><br></p>
<p>✔️<strong><code>new Promise(executor)</code></strong> -&gt;(promise의 형태)</p>
<br>

<p><strong>- Promise를 생성하게되면 executor(실행함수)가 바로 실행된다.</strong></p>
<ul>
<li><strong><code>executor</code></strong>
resolve 및 reject 인수를 전달할 실행 함수. 실행 함수는 프로미스 구현에 의해 resolve와 reject 함수를 받아 즉시 실행됩니다(실행 함수는 Promise 생성자가 생성한 객체를 반환하기도 전에 호출됩니다). resolve 및 reject 함수는 호출할 때 각각 프로미스를 이행하거나 거부합니다. 실행 함수는 보통 어떤 비동기 작업을 시작한 후 모든 작업을 끝내면 resolve를 호출해 프로미스를 이행하고, 오류가 발생한 경우 reject를 호출해 거부합니다. 실행 함수에서 오류를 던지면 프로미스는 거부됩니다. 실행 함수의 반환값은 무시됩니다.</li>
</ul>
<p><strong>- Promise는 클래스 문법과 같이 <code>new</code> 키워드와 생성자를 사용해 만든다.</strong></p>
<ul>
<li>Promise 객체는 <code>new</code> 키워드와 생성자를 사용해 만듭니다. 생성자는 매개변수로 &quot;실행 함수&quot;를 받습니다. 이 함수는 매개 변수로 두 가지 함수를 받아야 하는데, 첫 번째 함수(resolve)는 비동기 작업을 성공적으로 완료해 결과를 값으로 반환할 때 호출해야 하고, 두 번째 함수(reject)는 작업이 실패하여 오류의 원인을 반환할 때 호출하면 됩니다. 두 번째 함수는 주로 오류 객체를 받습니다.</li>
</ul>
<blockquote>
<pre><code>const myFirstPromise = new Promise((resolve, reject) =&gt; {
  // do something asynchronous which eventually calls either:
  //    (=둘 중 하나를 부르는 비동기적인 일을 한다)
  //   resolve(someValue)        // fulfilled(성공)
  // or
  //   reject(&quot;failure reason&quot;)  // rejected(실패)
});</code></pre></blockquote>
<pre><code>
**- Promise를 즉시 실행할 수도 있고 `then`으로 호출하여 필요시에 사용할 수도 있다.**

&lt;br&gt;

**📖 Example(출처-https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise)**

&gt; ```
function myAsyncFunction(url) {
  return new Promise((resolve, reject) =&gt; {
    const xhr = new XMLHttpRequest()
    xhr.open(&quot;GET&quot;, url)
    xhr.onload = () =&gt; resolve(xhr.responseText)
    xhr.onerror = () =&gt; reject(xhr.statusText)
    xhr.send()
  });
}</code></pre><p><br><br><br></p>
<hr>
<br>

<h2 id="✅promise에서-가장-중요한-state-⭐⭐⭐">✅Promise에서 가장 중요한 state ⭐⭐⭐</h2>
<blockquote>
<ol>
<li>pending(대기): 초기 상태</li>
<li>Fulfilled(이행): 성공적으로 완료된 상태</li>
<li>Rejected(실패): 실패 상태</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/b3d54072-5e1d-4057-8488-87e2f521efed/image.png" alt=""></p>
<p><br><br><br></p>
<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/2d85711b-a765-4982-a6bb-74a7a6e348d4/image.png" alt="">
<img src="https://velog.velcdn.com/images/kimhyesu-_-/post/be43bd6a-fa4c-4dbb-83af-2e18cbab6e3c/image.png" alt=""></p>
<p><strong>- 5초 뒤 <code>안녕</code>찍히면서 상태 변함</strong></p>
<br>

<p><strong>✅Promise를 소비(사용)하는 <code>.then</code>  <code>.catch</code> <code>finally</code></strong></p>
<blockquote>
<pre><code>promise
    .then((result)=&gt;{  
  console.log(result) // 성공(정상작동일때 then메소드에서 값을 처리)
})
    .catch((error)=&gt;{
  console.log(error) // 실패(오류를 잡음)
})
    .finally(()=&gt;{
  console.log(&#39;성공이든 실패든 실행된다&#39;)
})</code></pre></blockquote>
<pre><code>
***

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

### _✍🏻코드로 Promise 이해해보기_
&gt; ```
const getApple = () =&gt; 
  new Promise((resolve,reject)=&gt;{
    setTimeout(()=&gt; resolve(&#39;🍎&#39;), 1000)
  })
&gt;
const getBanana = (apple) =&gt;
    new Promise((resolve,reject)=&gt;{
    setTimeout(()=&gt;resolve(`${apple} =&gt; 🍌`), 1000)
  })
&gt;
const getTrain = (banana) =&gt;
    new Promise((resolve,reject)=&gt; {
      setTimeout(()=&gt; resolve(`${banana} =&gt; 🚈`), 1000)
  })
&gt;
// getApple()
//     .then((banana)=&gt; getBanana(banana))
//     .then((train)=&gt; getTrain(train))
//     .then((result)=&gt; console.log(result))
&gt;
getApple()
    .then(getBanana)
    .then(getTrain)
    .then(console.log)
//&#39;🍎 =&gt; 🍌 =&gt; 🚈&#39;</code></pre><h2 id="✔️-getapple-위쪽은-promise를-제공하는-곳-then부분은-promise를-소비하는-곳">✔️ getApple() 위쪽은 Promise를 제공하는 곳! .then()부분은 Promise를 소비하는 곳!</h2>
<p><br><br></p>
<h3 id="✍catch-사용해서-에러-잡는법">✍catch 사용해서 에러 잡는법</h3>
<blockquote>
<pre><code>const getApple = () =&gt; 
  new Promise((resolve,reject)=&gt;{
    setTimeout(()=&gt; resolve(&#39;🍎&#39;), 1000)
  })
</code></pre></blockquote>
<p>const getBanana = (apple) =&gt;
    new Promise((resolve,reject)=&gt;{
    setTimeout(()=&gt;reject(new Error (<code>${apple} =&gt; 🍌</code>)), 1000)
  })                        //getBanana 함수에서 Error를 입력함</p>
<blockquote>
</blockquote>
<p>const getTrain = (banana) =&gt;
    new Promise((resolve,reject)=&gt; {
      setTimeout(()=&gt; resolve(<code>${banana} =&gt; 🚈</code>), 1000)
  })</p>
<blockquote>
</blockquote>
<p>getApple()
    .then(getBanana)
    .catch((error)=&gt; {
  return &#39;🍍&#39;
})                             //return 값으로 파인애플을 입력함
    .then(getTrain)
    .then(console.log)
//&quot;🍍 =&gt; 🚈&quot; (사과와 바나나는 없어지고 파인애플과 기차만 남음)</p>
<pre><code>
&lt;br&gt;

***

## ✅Promise.all과 Promise.race
- `all`은 제일 늦게 끝나는 것 기준
- `race`는 제일 빨리 끝나는 것 기준

&lt;br&gt;

### ✔️Promise.all 
&gt; ```
function timer(time) {
  return new Promise((resolve,reject)=&gt; {
    setTimeout(()=&gt;{
      resolve(time)
    },time)
  })
} //비동기 로직으로 성공적으로 완료되어 time의 숫자를 결과값으로 반환한다.
&gt;
console.time(&#39;all&#39;)
Promise.all([timer(1000), timer(2000), timer(3000)]).then((result)=&gt; {
  console.log(&#39;result&#39;, result)
  console.timeEnd(&#39;all&#39;)
})
//&#39;result&#39; [ 1000, 2000, 3000 ]
//&#39;all: 3001ms&#39;</code></pre><p><br><br></p>
<h3 id="✍🏻promiseall-특징">✍🏻Promise.all 특징</h3>
<blockquote>
<ul>
<li>순서대로 실행되지만, 앞의 함수를 기다리지 않는다.</li>
</ul>
</blockquote>
<ul>
<li>무조건 비동기 방식에서만 사용한다.
(그래서 비동기식으로 사용하지 않으면 그 데이터는 불러오지 못했기 때문에 <code>pending</code>상태로 불려짐)</li>
<li>하나라도 <code>reject</code>에 해당된다면 결과값은 <code>reject</code>값이 된다.
(ex. 하나라도 누락되면 페이지 안보여줄때 사용함)</li>
<li>모든 promise를 실행한 후 진행되는 하나의 promise를 반환함✔️</li>
</ul>
<br>

<hr>
<p><br><br></p>
<h3 id="✔️promiserace">✔️Promise.race</h3>
<blockquote>
<pre><code>function timer(time) {
  return new Promise((resolve,reject)=&gt; {
    setTimeout(()=&gt;{
      resolve(time)
    },time)
  })
} //비동기 로직으로 성공적으로 완료되어 time의 숫자를 결과값으로 반환한다.
</code></pre></blockquote>
<p>console.time(&#39;all&#39;)
Promise.race([timer(1000), timer(2000), timer(3000)]).then((result)=&gt; {
  console.log(&#39;result&#39;, result)
  console.timeEnd(&#39;all&#39;)
})
//&#39;result&#39; 1000
//&#39;all: 1009ms&#39;</p>
<p>```</p>
<p><br><br></p>
<h3 id="❗정리">❗정리</h3>
<blockquote>
<ul>
<li>동시에 트리거가 된다(약간의 차이 있음)</li>
</ul>
</blockquote>
<ul>
<li>promise.all: 마지막 기준</li>
<li>promise.race: 처음 기준</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSR과 SSR]]></title>
            <link>https://velog.io/@kimhyesu-_-/CSR%EA%B3%BC-SSR</link>
            <guid>https://velog.io/@kimhyesu-_-/CSR%EA%B3%BC-SSR</guid>
            <pubDate>Tue, 09 Aug 2022 06:19:21 GMT</pubDate>
            <description><![CDATA[<h3 id="🥨csr과-ssr">🥨CSR과 SSR</h3>
<p>-어느쪽에서 렌더링을 하는지에 따라 다름</p>
<br>

<h3 id="🥨ssr과-ssg">🥨SSR과 SSG</h3>
<p>-서버에서 요청 시에 즉시 만드느냐 미리 다 만들어 놓느냐</p>
<br>

<h3 id="🥨ssr">🥨SSR</h3>
<p>-요청할 때 즉시 만드니까 데이터가 달라져서 미리 만들어두기 어려운 페이지에 적합</p>
<h3 id="🥨ssg">🥨SSG</h3>
<p>-미리 다 만들어두니까 바뀔 일이 거의 없는 페이지에 적합</p>
<p><br><br></p>
<h1 id="1-csrclient-side-rendering">1. CSR(Client Side Rendering)</h1>
<p>: 사용자 요청에 따라 필요한 부분만 응답 받아서 렌더링함.</p>
<h2 id="✅장점">✅장점</h2>
<ol>
<li>초기 로딩 이후에 페이지 일부를 변경할 때 서버에 해당 데이터만 요청하면 되기 때문에 이후 구동 속도는 빠르다</li>
<li>서버가 빈 뼈대만 있는 HTML을 넘겨주는 역할만 수행하면 됨 ==&gt; 서버측에 부하가 적음</li>
<li>클라이언트 측에서 연산, 라우팅 등을 모두 직접 처리하기 때문에 반응 속도가 빠르고 UX도 우수함</li>
</ol>
<br>

<h2 id="❌단점">❌단점</h2>
<ol>
<li>사용자가 첫 화면을 보기까지 시간이 오래 걸릴 수 있다.(초기 로딩 속도 느림)</li>
<li>썩 좋지 않은 SEO
: html의 body는 대부분 텅텅 비어져있음. 웹크롤러는 html을 읽어서 검색 가능한 색인(페이지,목록)을 만들어냄. 근데 웹크롤러봇 입장에서 본 html은 텅텅 비어있음. 검색엔진이 색인할만한 컨텐츠가 존재하지 않음.</li>
<li>검색엔진에 불리하다는 치명적인 단점</li>
</ol>
<p><br><br></p>
<hr>
<h1 id="2-ssrserver-side-rendering">2. SSR(Server Side Rendering)</h1>
<p>: 서버로부터 완전하게 만들어진 HTML 파일을 받아와서 페이지 전체를 렌더링</p>
<h2 id="✅장점-1">✅장점</h2>
<ol>
<li>CSR을 사용했을 때보다 첫 번째 페이지로딩이 빨라짐(서버에서 필요한 데이터를 모두 가져와서 html 파일을 만들기 때문에)</li>
<li>모든 컨텐츠가 html에 담겨져 있기 때문에 조금 더 효율적인 SEO(Search Engine Optimization)를 할 수 있다.</li>
</ol>
<br>

<h2 id="❌단점-1">❌단점</h2>
<ol>
<li>깜빡임 이슈 존재
: 사용자가 클릭-&gt; 전체적인 웹사이트를 다시 서버에서 받아옴==&gt; 썩 좋지 않은 UX</li>
<li>서버 과부하
: 특히 사용자가 많은 제품일수록 사용자가 클릭을 할 때마다 서버에서 요청해서 서버에서 필요한 데이터를 가지고 html을 만들어야하므로</li>
<li>TTV와 TTI 간극이 발생(가장 치명적인 단점)
: 동적으로 데이터를 처리하는 js를 다운받는동안 사용자가 여기저기 클릭했는데도 아무런 반응이 없는 경우 발생..</li>
</ol>
<p><br><br></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP와 HTTPS ]]></title>
            <link>https://velog.io/@kimhyesu-_-/HTTP%EC%99%80-HTTPS</link>
            <guid>https://velog.io/@kimhyesu-_-/HTTP%EC%99%80-HTTPS</guid>
            <pubDate>Mon, 08 Aug 2022 17:52:57 GMT</pubDate>
            <description><![CDATA[<h1 id="📌httphyper-text-transfer-protocol">📌HTTP(Hyper Text Transfer Protocol)</h1>
<ul>
<li>서버/클라이언트 모델에 따라 데이터를 주고 받기 위한 프로토콜. </li>
<li>80번 포트를 사용한다.</li>
<li>프로토콜은 약속, 규약이라는 의미</li>
</ul>
<p><br><br><br><br></p>
<h2 id="but-❗❗❗">But ❗❗❗</h2>
<p><code>HTTP는 암호화되지 않은 데이터를 전송하는 프로토콜</code>이어서 HTTP로 주민번호나 비밀번호를 주고 받으면 제 3자가 정보를 조회할 수 있었음. 그래서 이 문제를 해결하기 위해서 HTTPS가 등장함</p>
<p><br><br><br><br></p>
<h1 id="📌http--secure--https">📌HTTP + Secure = HTTPS</h1>
<ul>
<li>HTTP에 데이터 암호화가 추가된 프로토콜. 보안을 위해 나타남(암호화 O)</li>
<li>443번 포트를 사용한다.</li>
<li>네트워크 상에서 중간에 제 3자가 정보를 볼 수 없다.</li>
</ul>
<br>

<p><strong>🔒주소창에 자물쇠 모양이 있으면 HTTPS가 적용된 사이트이다.</strong>
<img src="https://velog.velcdn.com/images/kimhyesu-_-/post/015aae5f-0145-4796-8d47-c91d6571a0d0/image.png" alt=""></p>
<p><br><br><br></p>
<h3 id="✅https-동작원리-그림으로-알아보기made-by-와타시">✅HTTPS 동작원리 그림으로 알아보기(made by 와타시)</h3>
<p><img src="https://velog.velcdn.com/images/kimhyesu-_-/post/31083da0-37f8-4df8-8480-555279d544c3/image.png" alt="">
<em><strong>*내가 서버로 전달한 정보는 매우 안전하게 지켜짐</strong></em></p>
<p><br><br></p>
<h3 id="⭐https에서는-회사-서버에서-2개의-암호키를-가지고-있다는-것이-핵심이다">⭐HTTPS에서는 회사 서버에서 2개의 암호키를 가지고 있다는 것이 핵심이다.</h3>
<ul>
<li>개인key로 암호화 된 정보=&gt; 공개key로 암호를 품</li>
<li>공개key로 암호화 된 정보=&gt; 개인key로 암호를 품</li>
</ul>
<br>

<p><strong>✔️ 위처럼 하지 않으면 공개key를 가진 누군가가 내 정보를 해독할 수 있게돼서 암호화가 의미가 없어짐! 공개key는 말그대로 공개된 key. 누구나 가질 수 있음.</strong></p>
<br>
<br>


<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[⭐React 프로젝트 초기설정⭐]]></title>
            <link>https://velog.io/@kimhyesu-_-/React-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%B4%88%EA%B8%B0%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@kimhyesu-_-/React-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%B4%88%EA%B8%B0%EC%84%A4%EC%A0%95</guid>
            <pubDate>Wed, 03 Aug 2022 14:14:25 GMT</pubDate>
            <description><![CDATA[<h3 id="✍🏻나를위해-정리하는-글-💖은별천사-is-love💖">✍🏻나를위해 정리하는 글 💖은별천사 is love💖</h3>
<p><br><br><br></p>
<h2 id="1-cra-설치">1. CRA 설치</h2>
<blockquote>
<pre><code>npx create-react-app (폴더명)</code></pre></blockquote>
<pre><code>
&lt;br&gt;

## 2. Router 설치

&gt; ```
npm install react-router-dom --save</code></pre><br>

<h2 id="3-sass-설치-선택">3. Sass 설치 (선택)</h2>
<blockquote>
<pre><code>npm install sass --save</code></pre></blockquote>
<pre><code>

&lt;br&gt;

## 4. Styled-component + reset 설치 (선택)

&gt; ```
npm install --save styled-components styled-reset</code></pre><br>

<h2 id="5-polyfill-설치-cross-browsing-issue">5. polyfill 설치 (Cross-browsing issue)</h2>
<blockquote>
<pre><code>npm install react-app-polyfill</code></pre></blockquote>
<pre><code>
&lt;br&gt;

## 6. Eslint + Prettier 한번에 깔기

&gt; ```
npm install -D prettier eslint-config-prettier eslint-plugin-prettier</code></pre><br>

<h2 id="7-mac용-eslinttrc-작성">7. Mac용 .eslinttrc 작성</h2>
<blockquote>
<pre><code>{
    &quot;extends&quot;: [&quot;react-app&quot;, &quot;plugin:prettier/recommended&quot;],
    &quot;rules&quot;: {
      &quot;no-var&quot;: &quot;warn&quot;, // var 금지
      &quot;no-multiple-empty-lines&quot;: &quot;warn&quot;, // 여러 줄 공백 금지
      &quot;no-console&quot;: [&quot;warn&quot;, { &quot;allow&quot;: [&quot;warn&quot;, &quot;error&quot;] }], // console.log() 금지
      &quot;eqeqeq&quot;: &quot;warn&quot;, // 일치 연산자 사용 필수
      &quot;dot-notation&quot;: &quot;warn&quot;, // 가능하다면 dot notation 사용
      &quot;no-unused-vars&quot;: &quot;warn&quot;, // 사용하지 않는 변수 금지
      &quot;react/destructuring-assignment&quot;: &quot;warn&quot;, // state, prop 등에 구조분해 할당 적용
      &quot;react/jsx-pascal-case&quot;: &quot;warn&quot;, // 컴포넌트 이름은 PascalCase로
      &quot;react/no-direct-mutation-state&quot;: &quot;warn&quot;, // state 직접 수정 금지
      &quot;react/jsx-no-useless-fragment&quot;: &quot;warn&quot;, // 불필요한 fragment 금지
      &quot;react/no-unused-state&quot;: &quot;warn&quot;, // 사용되지 않는 state
      &quot;react/jsx-key&quot;: &quot;warn&quot;, // 반복문으로 생성하는 요소에 key 강제
      &quot;react/self-closing-comp&quot;: &quot;warn&quot;, // 셀프 클로징 태그 가능하면 적용
      &quot;react/jsx-curly-brace-presence&quot;: &quot;warn&quot;, // jsx 내 불필요한 중괄호 금지
      &quot;prettier/prettier&quot;: [
        &quot;error&quot;,
        {
          &quot;endOfLine&quot;: &quot;auto&quot;
        }
      ]
    }
  }</code></pre></blockquote>
<pre><code>

&lt;br&gt;

## 8. Window용 .eslintrc 작성

&gt; ```
{
  &quot;extends&quot;: [&quot;react-app&quot;, &quot;plugin:prettier/recommended&quot;],
  &quot;rules&quot;: {
    &quot;no-var&quot;: &quot;warn&quot;, // var 금지
    &quot;no-multiple-empty-lines&quot;: &quot;warn&quot;, // 여러 줄 공백 금지
    &quot;no-console&quot;: [&quot;warn&quot;, { &quot;allow&quot;: [&quot;warn&quot;, &quot;error&quot;] }], // console.log() 금지
    &quot;eqeqeq&quot;: &quot;warn&quot;, // 일치 연산자 사용 필수
    &quot;dot-notation&quot;: &quot;warn&quot;, // 가능하다면 dot notation 사용
    &quot;no-unused-vars&quot;: &quot;warn&quot;, // 사용하지 않는 변수 금지
    &quot;react/destructuring-assignment&quot;: &quot;warn&quot;, // state, prop 등에 구조분해 할당 적용
    &quot;react/jsx-pascal-case&quot;: &quot;warn&quot;, // 컴포넌트 이름은 PascalCase로
    &quot;react/no-direct-mutation-state&quot;: &quot;warn&quot;, // state 직접 수정 금지
    &quot;react/jsx-no-useless-fragment&quot;: &quot;warn&quot;, // 불필요한 fragment 금지
    &quot;react/no-unused-state&quot;: &quot;warn&quot;, // 사용되지 않는 state
    &quot;react/jsx-key&quot;: &quot;warn&quot;, // 반복문으로 생성하는 요소에 key 강제
    &quot;react/self-closing-comp&quot;: &quot;warn&quot;, // 셀프 클로징 태그 가능하면 적용
    &quot;react/jsx-curly-brace-presence&quot;: &quot;warn&quot;, // jsx 내 불필요한 중괄호 금지
    &quot;prettier/prettier&quot;: [
      &quot;error&quot;,
      {
        &quot;endOfLine&quot;: &quot;auto&quot;
      }
    ]
  }
}</code></pre><br>

<h2 id="9-prettierrc-작성">9. .prettierrc 작성</h2>
<blockquote>
<pre><code>{
  &quot;tabWidth&quot;: 2,
  &quot;endOfLine&quot;: &quot;lf&quot;,
  &quot;arrowParens&quot;: &quot;avoid&quot;,
  &quot;singleQuote&quot;: true
}</code></pre></blockquote>
<pre><code>

&lt;br&gt;

## 10. .gitignore에 추가

&gt; ```
.eslintcache</code></pre><br>

<h2 id="11-indexjs">11. index.js</h2>
<blockquote>
<pre><code>import &#39;react-app-polyfill/stable&#39;;
import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom&#39;;
import GlobalStyle from &#39;./Styles/globalStyle&#39;;
import theme from &#39;./Styles/theme&#39;;
import { ThemeProvider } from &#39;styled-components&#39;;
import Routes from &#39;./Routes&#39;;
</code></pre></blockquote>
<p>ReactDOM.render(
  &lt;&gt;
    <GlobalStyle />
    <ThemeProvider theme={theme}>
      <Routes />
    </ThemeProvider>
  &lt;/&gt;,
  document.getElementById(&#39;root&#39;)
);</p>
<pre><code>



&lt;br&gt;

## 12. Routes.js

&gt; ```
import React from &#39;react&#39;;
import { BrowserRouter as Router, Switch, Route } from &#39;react-router-dom&#39;;
import 컴포넌트명 from &#39;./Page/컴포넌트명&#39;;
&gt;
function Routes() {
  return (
    &lt;Router&gt;
      &lt;Switch&gt;
        &lt;Route exact path=&quot;/&quot; component={() =&gt; &lt;컴포넌트명 /&gt;} /&gt;
      &lt;/Switch&gt;
    &lt;/Router&gt;
  );
}
&gt;
export default Routes;</code></pre><br>

<h2 id="13-styles-폴더--globalstylejs">13. Styles 폴더 &gt; globalStyle.js</h2>
<blockquote>
<pre><code>import { createGlobalStyle } from &#39;styled-components&#39;;
import reset from &#39;styled-reset&#39;;
</code></pre></blockquote>
<p>const GlobalStyle = createGlobalStyle`
${reset}
*{
  position: relative;
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  position: relative;
}</p>
<blockquote>
</blockquote>
<p>body{
  font-family: &#39;Noto Sans KR&#39;, &#39;Apple SD Gothic Neo&#39;, &#39;Nanum Gothic&#39;, &#39;Malgun Gothic&#39;, sans-serif;
  box-sizing: border-box;
  position: relative;
}</p>
<blockquote>
</blockquote>
<p>button:hover{
  cursor: pointer;
}
`;</p>
<blockquote>
</blockquote>
<p>export default GlobalStyle;</p>
<pre><code>


&lt;br&gt;

## 14. Styles 폴더 &gt; theme.js (edit)

&gt; ```
const theme = {
  background: &#39;#FFFEFC&#39;,
  white: &#39;#FFFFFF&#39;,
  vermilion: &#39;#ff7425&#39;,
  orange: &#39;#FF9900&#39;,
  opacityOrange: &#39;rgba(242,153,74,0.5)&#39;,
  yellow: &#39;#FFD66C&#39;,
  grey: &#39;rgba(196,196,196,0.3)&#39;,
  middleGrey: &#39;rgba(65,65,65,0.4)&#39;,
  deepGrey: &#39;#828282&#39;,
  lightOrange: &#39;rgba(255,195,170,0.3)&#39;,
  fontColor: &#39;#2D2B2B&#39;,
  fontTitle: &quot;&#39;Alata&#39;, sans-serif;&quot;,
};
&gt;
export default theme;</code></pre><br>

<h2 id="15-git-repository-연결">15. git repository 연결</h2>
<blockquote>
<pre><code>git add . 
git commit -m &quot;(커밋 메시지)&quot;
</code></pre></blockquote>
<p>// Push an existing repository from the command line
git remote add origin (깃헙주소) 
git remote -v 
git push origin main</p>
<pre><code>

&lt;br&gt;&lt;br&gt;&lt;br&gt;
***</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[⭐API 호출하고 싶을 때⭐]]></title>
            <link>https://velog.io/@kimhyesu-_-/API-%ED%98%B8%EC%B6%9C%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%9D%84-%EB%95%8C</link>
            <guid>https://velog.io/@kimhyesu-_-/API-%ED%98%B8%EC%B6%9C%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%9D%84-%EB%95%8C</guid>
            <pubDate>Tue, 02 Aug 2022 08:57:49 GMT</pubDate>
            <description><![CDATA[<h1 id="✍🏻나를-위해서-기록하는-api-호출-함수">✍🏻나를 위해서 기록하는 API 호출 함수</h1>
<blockquote>
<pre><code>const callAPI = async() =&gt;{
    let url = new URL(`url주소`)
    let header = new Headers({헤더내용}) // 이건 필요한 경우만
    let response = await fetch(url,{headers:header})
    let data = await response.json()
}</code></pre></blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[반응형 그리고 Doctype]]></title>
            <link>https://velog.io/@kimhyesu-_-/%EB%B0%98%EC%9D%91%ED%98%95-%EA%B7%B8%EB%A6%AC%EA%B3%A0-Doctype</link>
            <guid>https://velog.io/@kimhyesu-_-/%EB%B0%98%EC%9D%91%ED%98%95-%EA%B7%B8%EB%A6%AC%EA%B3%A0-Doctype</guid>
            <pubDate>Tue, 02 Aug 2022 07:15:23 GMT</pubDate>
            <description><![CDATA[<h2 id="✅반응형-웹-디자인">✅반응형 웹 디자인?</h2>
<ul>
<li><p>하나의 웹 사이트에서 PC, 스마트폰, 태블릿PC 등 <strong>접속하는 디스플레이 종류에 따라 화면의 크기가 자동으로 변하도록 만든 웹페이지 접근 기법</strong>을 말한다. 따라서 <strong>유지보수가 효율적</strong>이다. 사용자 입장에서도 기기에 구애받지 않고 <strong>항상 최적의 화면을 경험</strong>할 수 있다는 측면에서 반응형 웹의 장점이 고스란히 나타난다.</p>
</li>
<li><p>반면 이러한 특징때문에 발생하는 단점이 있는데, <strong>모바일 사이트에 비해서 무겁다는 점이다</strong>. 이는 사이트 속도와 직결되는 문제로, 사용자 입장에서는 불편하게 느낄 수도 있다. 반응형 웹 디자인은 <strong>모바일 사이트보다 읽어들이는 소스가 많아서 불필요하게 많은 데이터를 소비</strong>할 수도 있고, 데스크톱 사이트와 모바일 사이트의 용도가 다른 사이트의 경우 이러한 반응형 웹 디자인은 걸림돌이 될수 있다. <strong>또한 IE8 이하에서 깨진다는 단점이 있다.(요즘은 IE8이하 쓰는 사람 거의 없음)</strong></p>
</li>
</ul>
<p><br><br></p>
<hr>
<h2 id="✅doctype">✅Doctype?</h2>
<ul>
<li><p>문서 형식 선언(Document Type Declaration) 쉽게 말하자면 <strong>내가 작성하려는 HTML 문서가 어떤 문서 형식을 갖고 있는지 선언해주는 것</strong>을 말한다.</p>
</li>
<li><p>웹 브라우저에서 문서 형식 선언이 없으면 <code>쿼크모드</code>로 렌더링을 해서 각 브라우저마다 다른 형태의 결과물을 보여주게 되는데 이것을 방지하기 위해서 문서 형식 선언을 하고 그로인해 HTML 문서를 표준모드로 렌더링 할 수 있게된다.</p>
</li>
</ul>
<blockquote>
<p>📌쿼크모드
: 오래된 웹 페이지의 하위 호환성 유지를 위해 사용되며, W3C나 IETF의 표준을 엄격하게 준수하지 않는다. 같은 코드라도 웹 브라우저마다 다르게 해석해서 다른 결과물을 보여준다.</p>
</blockquote>
<ul>
<li>Doctype 무선언 -&gt; 쿼크모드로 렌더링 -&gt; 브라우저마다 다른 결과물 출력</li>
<li>Doctype 선언 -&gt; 표준모드로 렌더링 -&gt; 브라우저별로 같은 레이아웃으로 결과물 출력</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SCSS SASS CSS Styled-components]]></title>
            <link>https://velog.io/@kimhyesu-_-/SCSS-SASS-CSS-Styled-components</link>
            <guid>https://velog.io/@kimhyesu-_-/SCSS-SASS-CSS-Styled-components</guid>
            <pubDate>Tue, 02 Aug 2022 06:42:20 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>React-Sass 요약 링크 
<a href="https://velog.io/@kimhyesu-_-/React-Sass">https://velog.io/@kimhyesu-_-/React-Sass</a></p>
</blockquote>
<p><br><br></p>
<h2 id="✍🏻css-sass-scss">✍🏻CSS, SASS, SCSS?</h2>
<h3 id="1-css-cascading-style-sheets">1. CSS: Cascading Style Sheets</h3>
<ul>
<li>종속형 시트/HTML을 꾸며줌/.css<br>

</li>
</ul>
<h3 id="2-sass-syntactically-awesome-style-sheets">2. SASS: Syntactically Awesome Style Sheets</h3>
<ul>
<li>문법적으로 어썸한 스타일시트/.sass</li>
<li>기존의 CSS의 유지보수의 불편함을 해결</li>
<li>코드 중복을 줄일 수 있다.</li>
<li><strong>유효범위를 들여쓰기로 구분함</strong></li>
<li>@import, @include, @mixin 등 다양한 함수 및 변수를 제공함<br>

</li>
</ul>
<h3 id="3-scss-sassy-css">3. SCSS: Sassy CSS</h3>
<ul>
<li>문법적으로 짱 멋진(Sassy) CSS/.scss</li>
<li>CSS보다 간단한 표기법. 유지보수 편의성 향상</li>
<li>CSS와 비슷함. <strong><code>{}</code>중괄호와 <code>;</code>세미콜론을 그대로 사용함</strong></li>
<li><strong>유효범위를 중괄호로 구분함</strong></li>
<li>중첩(nesting)
<img src="https://velog.velcdn.com/images/kimhyesu-_-/post/572896ef-3b39-44cd-9e08-eefe2d58b157/image.png" alt=""></li>
</ul>
<p><br><br></p>
<h3 id="✔️sass와-scss-문법">✔️SASS와 SCSS 문법</h3>
<blockquote>
<pre><code>/* SASS */
.main
  .side
    display:block
    text-align:center
    p
      color:#333
    a
      display:inline-block
      font-weight:bold
</code></pre></blockquote>
<p>/* SCSS */
.main {
  .side {
    display: block; text-align:center;
    p{color:#333}
    a{display: inline-block;font-weight: bold;}
  }
}</p>
<pre><code>
&lt;br&gt;&lt;br&gt;

## 🗨️결론
1. SCSS와 SASS는 CSS를 편리하게 이용할 수 있도록 도와주는 역할이며 추가 기능이 있는정도로 생각하면 좋을듯. SCSS와 SASS는 기능적으로는 유의미한 차이가 없음. 문법적인 방식에 차이가 있음.
2. SASS보다 SCSS가 뒤에 나왔고 문법 차이가 있지만 **SCSS가 더 넓은 범용성과 가독성이 좋고 CSS의 호환성등의 장점으로 SCSS를 사용하기를 권장하고 있다.**

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

***

## ✍🏻styled-components란?

* **동일한 컴포넌트에서 컴포넌트 이름을 쓰듯 스타일을 지정**하는 것을 styled-components라고 부른다. css 파일을 밖에 두지않고, 컴포넌트 내부에 넣기 때문에 **css가 전역으로 중첩되지 않도록 만들어주는 장점**이 있다. 하지만** 빠른 페이지로드에 불리하다는 단점이 있다.**

&lt;br&gt;

### ✔️환경설정

&gt; ```
npm install styled-components</code></pre><p><br><br></p>
<p><strong>📌wecode yakurt 프로젝트 캡쳐(스타일컴포넌트 사용)</strong>
<img src="https://velog.velcdn.com/images/kimhyesu-_-/post/9b83d540-6769-4643-bbac-0ea36be7cbed/image.png" alt=""></p>
<p><br><br><br></p>
<hr>
<h2 id="✅styled-components와-scss의-차이점">✅Styled-components와 SCSS의 차이점</h2>
<h3 id="1-scss">1. SCSS</h3>
<ul>
<li>css in css 문법으로 <code>.js</code>파일과 분리(이미 html 문서에 읽혀져 있는 상태라 처음엔 스타일 정보를 가져오는 양이 많더라도 추가적인 렌더링은 상대적으로 스타일컴포넌트보다 적음)</li>
<li>다른 컴포넌트의 상태값이 변하더라도 반응하기 쉽지 않음</li>
<li>브라우저에 보이지 않는 컴포넌트까지 읽기 때문에 불필요한 컴파일과정이 추가됨</li>
</ul>
<br>

<h3 id="2-styled-components">2. Styled-components</h3>
<ul>
<li>css in js 방식으로 컴포넌트가 렌더링 될 때만 해당 스타일 정보를 읽음</li>
<li>동적인 이벤트가 많은 사이트=&gt; 컴포넌트가 자주 렌더링 될 때 그만큼 스타일 정보도 다시 읽어와야 됨</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>