<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ryuwisdom.log</title>
        <link>https://velog.io/</link>
        <description>Ryuwisdom</description>
        <lastBuildDate>Mon, 22 Aug 2022 13:53:25 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ryuwisdom.log</title>
            <url>https://images.velog.io/images/ryuwisdom0_o/profile/495f4ebc-b6f5-4cff-ae71-75aa91d136fb/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ryuwisdom.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ryuwisdom0_o" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[자료구조 - 스택(Stack), 큐(Queue)]]></title>
            <link>https://velog.io/@ryuwisdom0_o/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9DStack-%ED%81%90Queue-%ED%8A%B8%EB%A6%ACtree</link>
            <guid>https://velog.io/@ryuwisdom0_o/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9DStack-%ED%81%90Queue-%ED%8A%B8%EB%A6%ACtree</guid>
            <pubDate>Mon, 22 Aug 2022 13:53:25 GMT</pubDate>
            <description><![CDATA[<h2 id="스택stack">스택(Stack)</h2>
<h3 id="스택의-정의">스택의 정의</h3>
<p>스택과 큐가 데이터를 저장하는 방법은 배열과 같다.</p>
<p>스택은 리스트의 끝에서만 데이터가 들어오고 나가는 자료구조이다.
<strong>Javascript</strong>에서는 <strong>Array</strong>에 <strong>push</strong>와 <strong>pop</strong>을 이용하여 구현할 수 있다. 
스택은 마지막 리스트에서 자료를 넣거나 뺼 수 있는 선형 구조(Last in First Out)으로 되어있다.
스택이 비었으면 1을 반환하고, 그렇지 않다면 0을 반환한다.</p>
<p><img src="https://velog.velcdn.com/images/ryuwisdom0_o/post/2d922daa-c1ac-46bd-8db5-a39579501f1d/image.png" alt=""></p>
<h3 id="스택의-연산">스택의 연산</h3>
<ul>
<li>top() : 스택의 가장 윗(마지막) 데이터를 반환한다.</li>
<li>pop() : 스택의 가장 윗(마지막) 데이터를 삭제한다.</li>
<li>push() : 스택의 가장 윗 데이터로 top이 가리키는 자리 위에(top = top + 1) 메모리를 생성,데이터를 넣는다.</li>
</ul>
<h3 id="javascript-코드">Javascript 코드</h3>
<blockquote>
<pre><code>class Stack {
    constructor() {
      this.arr = [];
    }
    push(x) {
      this.arr.push(x);
    }
    pop() {
      return this.arr.pop();
    }
    empty() {
      if(arr.length == 0) {
        return 1;
      } else {
        return 0;
      }
    }
}
  const stack = new Stack();
  stack.push(1);
  stack.push(2);
  stack.push(3);
  console.log(stack.pop()); //3
  console.log(&#39;stack&#39;, stack); //[1, 2]</code></pre></blockquote>
<hr>
<h2 id="큐queue">큐(Queue)</h2>
<h3 id="큐의-정의">큐의 정의</h3>
<ul>
<li>먼저 집어 넣은 데이터가 먼저 나오는 선입선출(FIFO - Frist In First Out)구조로 저장하는 형식이다.</li>
<li>프린터의 출력 처리나 윈도우 시스템의 메시지 처리기, 프로세스 관리 등 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 이용한다.
<img src="https://velog.velcdn.com/images/ryuwisdom0_o/post/b1384cd4-c521-47ab-a741-874646c23946/image.png" alt=""></li>
</ul>
<h3 id="큐의-연산">큐의 연산</h3>
<ul>
<li>shift() : 큐의 맨 앞의 데이터를 삭제한다.</li>
<li>unshift() : 큐의 맨 앞의 데이터를 추가한다.</li>
</ul>
<h3 id="javascript-코드-1">Javascript 코드</h3>
<blockquote>
<pre><code>class Queue {
  constructor (){
    this.arr = [];
  }
  enqueue(item){
    this.arr.push(item);
  }
  dequeue(){
    return this.arr.shift();
  }
}
const queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.dequeue(); // 1
console.log(queue.arr) // [2,3]</code></pre></blockquote>
<p>출처 : <a href="http://paullab.co.kr">http://paullab.co.kr</a></p>
]]></description>
        </item>
        <item>
            <link>https://velog.io/@ryuwisdom0_o/tnb1aqzz</link>
            <guid>https://velog.io/@ryuwisdom0_o/tnb1aqzz</guid>
            <pubDate>Thu, 14 Jul 2022 02:02:43 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[자바스크립트는 어떻게 작동하는가_1]]></title>
            <link>https://velog.io/@ryuwisdom0_o/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%91%EB%8F%99%ED%95%98%EB%8A%94%EA%B0%801</link>
            <guid>https://velog.io/@ryuwisdom0_o/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%9E%91%EB%8F%99%ED%95%98%EB%8A%94%EA%B0%801</guid>
            <pubDate>Thu, 28 Jan 2021 02:50:39 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트는 여전히 가장 인기있는 언어로 자리매김하고 있고</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2iMPDPYL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kfrwrqxiqsb2w783cdme.png" alt=""></p>
<p>자바스크립트는 나에게 첫 언어이고
그렇기에 현재까지 자바스크립트를 기반으로 모든 프로젝트를 진행하였다.</p>
<p>그렇지만 자바스크립트 내부에서 어떻게 동작하는지 고민 해본 적이 있었던가...? </p>
<p>1편에서는 자바스크립트 엔진과 런타임, 콜스택으로 설명!</p>
<h4 id="자바스크립트-엔진v8">자바스크립트 엔진(V8)</h4>
<h4 id="v8이란-">V8이란 ?</h4>
<p>: C++로 작성된 구글의 오픈소스, ECMAScript, WEbAssembly엔진 -&gt; 즉 JS와 WASM을 <strong>실행</strong>할 수 있는 <strong>환경</strong></p>
<h4 id="v8이-수행하는-일">V8이 수행하는 일</h4>
<p>: JS, WASM 코드 컴파일, 실행
: 콜스택 처리(함수 실행)
: 메모리 할당
: 가비지 컬렉션</p>
<h4 id="v8의-실행-과정">V8의 실행 과정</h4>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/ab14a30b-ad40-481f-9d86-d52124c904f1/image.png" alt=""></p>
<h4 id="v8엔진-구성">V8엔진 구성</h4>
<p><img src="https://miro.medium.com/max/1400/1*X21ybPxqBtfRV5v9rD9J1A.png" alt="">
메모리힙(Memory Heap): 메모리할당이 이루어지는 곳
콜스택(Call Stack): 코드가 실행되면서 스택 프레임이 쌓이는 곳</p>
<h4 id="런타임">런타임</h4>
<p>브라우저에는 거의 모든 자바스크립트 개발자가 사용하는 API가 존재
<img src="https://miro.medium.com/max/1400/1*i9nTlOSPH3q-sCd5-WHg-g.png" alt=""></p>
<h4 id="콜스택">콜스택</h4>
<p>자바스크립트는 싱글 쓰레드(single-threaded) 프로그래밍 언어이다. 다시 말하면 콜스택이 하나라는 뜻. 따라서 한 번에 하나의 일만 할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[git(3) 파일 또는 폴더 이름 변경 (git rename file or folder)]]></title>
            <link>https://velog.io/@ryuwisdom0_o/git3-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%ED%8F%B4%EB%8D%94-%EC%9D%B4%EB%A6%84-%EB%B3%80%EA%B2%BD-git-rename-file-or-folder</link>
            <guid>https://velog.io/@ryuwisdom0_o/git3-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%ED%8F%B4%EB%8D%94-%EC%9D%B4%EB%A6%84-%EB%B3%80%EA%B2%BD-git-rename-file-or-folder</guid>
            <pubDate>Sun, 03 Jan 2021 13:50:58 GMT</pubDate>
            <description><![CDATA[<p>git 으로 버전 관리할 경우 파일이나 폴더의 이름 변경도 추적할 수 있어야 한다.</p>
<p>특히 리팩토링시 클래스나 패키지 폴더의 이름 변경은 자주 발생하는 작업이므로 변경 내역을 잘 관리해야 하며 git 의 아래 명령어를 사용하면 된다.</p>
<blockquote>
<pre><code>git mvLink to git mv</code></pre></blockquote>
<pre><code>파일 이동 명령어인 mv 사용하면 변경 사항을 추적할 수 있으며 다음과 같이 사용하면 된다.

&gt;```
git mv oldName newName</code></pre><blockquote>
<p>-n( --dry-run) 옵션을 사용하면 적용전에 어떻게 변경되는지 테스트가 가능하다.</p>
</blockquote>
<h4 id="mv-시-invalid-argument-가-발생할-경우">mv 시 invalid argument 가 발생할 경우</h4>
<p>mv 명령시 invalid argument 에러가 발생하는 경우가 있다. 제 경험상 파일이나 폴더 이름의 일부를 대소문자로 변경하는 경우에 발생한다.</p>
<p>예로 sprint 라는 폴더를 Sprint로 첫 글자를 대소문자로 변경하는 경우 위 에러를 접하게 된다.</p>
<p>이럴 경우 아래와 같이 임시 폴더 이름으로 rename 하고 임시 폴더 이름을 원래 바꾸려고 한 이름으로 rename 하는 2단계 절차를 거치면 된다. </p>
<blockquote>
<pre><code>git mv sprint tmpDir
git mv tmpDir Sprint</code></pre></blockquote>
<pre><code>

[Ref Link](https://stackoverflow.com/questions/11183788/in-a-git-repository-how-to-properly-rename-a-directory)
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Next js 소개]]></title>
            <link>https://velog.io/@ryuwisdom0_o/Next-js-%EC%86%8C%EA%B0%9C</link>
            <guid>https://velog.io/@ryuwisdom0_o/Next-js-%EC%86%8C%EA%B0%9C</guid>
            <pubDate>Sun, 03 Jan 2021 13:21:47 GMT</pubDate>
            <description><![CDATA[<h3 id="next-js">Next js</h3>
<p>:  React의 SSR(Server Side Rendering)을 쉽게 구현할 수 있게 도와주는 간단한 프레임워크</p>
<h3 id="ssr--vs--csr">SSR  vs  CSR</h3>
<p>: SSR은 서버에서 사용자에게 보여줄 페이지를 모두 구성하여 사용자에게 페이지를 보여주는 방식,
SSR을 사용하면 모든 데이터가 매핑된 서비스 페이지를 클라이언트(브라우저)에게 바로 보여줄 수 있다. 서버를 이용해서 페이지를 구성하기 때문에 클라이언트에서 구성하는 CSR(client-side rendering)보다 페이지를 구성하는 속도는 늦어지지만 전체적으로 사용자에게 보여주는 콘텐츠 구성이 완료되는 시점은 빨라진다는 장점이 있다. 더불어 SEO(search engine optimization) 또한 쉽게 구성할 수 있다.</p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/e696027a-5529-4ef8-bb8d-7d062cfa4b5d/ssr.png" alt=""></p>
<p>반면 CSR은 SSR보다 초기 전송되는 페이지의 속도는 빠르지만 서비스에서 필요한 데이터를 클라이언트(브라우저)에서 추가로 요청하여 재구성해야 하기 때문에 전제적인 페이지 완료 시점은 SSR보다 느려진다.</p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/db4468a8-9839-47a6-bf1e-ff715ac8b4d7/csr.png" alt=""></p>
<h3 id="next-js-핵심기능">Next js 핵심기능</h3>
<ol>
<li>기본적으로 서버사이드 렌더링을 제공함 </li>
<li>더욱 빠른 페이지 로드를 위한 코드 스플리팅 자동화</li>
<li>HMR을 지원하는 웹팩 기반 환경</li>
<li>Express나 Node.js와 같은 http 서버와 함께 구현 가능</li>
<li>Babel, Webpack 설정 커스터마이징 가능</li>
</ol>
<p>얼마나 많은 기업들이 Next js를 채택하여 사용하는지 볼 수 있다👇<br><a href="https://github.com/vercel/next.js/discussions/10640">https://github.com/vercel/next.js/discussions/10640</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Redux 필수 용어]]></title>
            <link>https://velog.io/@ryuwisdom0_o/Redux-%ED%95%84%EC%88%98-%EC%9A%A9%EC%96%B4</link>
            <guid>https://velog.io/@ryuwisdom0_o/Redux-%ED%95%84%EC%88%98-%EC%9A%A9%EC%96%B4</guid>
            <pubDate>Sun, 27 Dec 2020 14:34:20 GMT</pubDate>
            <description><![CDATA[<h3 id="redux-필수-용어"><strong>Redux 필수 용어</strong></h3>
<p><strong>store</strong>
store는 말그대로 전역에서 상태를 관리해주는 공간이다.객체 형태로 되어 있다.</p>
<p><strong>action</strong>
action은 상태 변화를 일으키는 주체이다. 객체 형태이고 타입이라는 것이 필수로 들어간다.
액션 생성 함수로 발행한다.</p>
<p><strong>reducer</strong>
reducer는 액션을 실행시키는 순수함수이다. 순수함수란 동일한 임자가 들어오면 동일한 결과를 반환해야 하며 외부의 상태를 변경하지 않는 함수를 말한다. 즉, 함수 내 변수 외에
외부의 값을 참조, 의존하거나 변경하지 않아야 한다는 것을 의미한다.
그래서 reducer는 현재 상태와 들어온 액션을 파라미터로 입력받아 새로운 상태값을 만들어서 반환한다.</p>
<p>(prevProps,action) =&gt; newState</p>
<p><strong>dispatch</strong>
스토어의 내장함수 중 하나이다. 이 함수가 호출되면 스토어는 리듀서 함수를 실행시켜서 새로운 함수를 만들어 준다.=&gt; 하지만 &quot;react-redux&quot;를 사용하면 dispatch함수를 쓰지 않고 더 쉽게 액션을 발행시킬 수 있다.</p>
<p><strong>provider</strong>
내가 사용하는 app이 스토어를 사용할 수 있게 래핑해주는 역할을 한다.props로 store를 전달한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Redux]]></title>
            <link>https://velog.io/@ryuwisdom0_o/Redux</link>
            <guid>https://velog.io/@ryuwisdom0_o/Redux</guid>
            <pubDate>Sun, 27 Dec 2020 14:23:32 GMT</pubDate>
            <description><![CDATA[<p><strong>Redux란?</strong>
자바스크립트 앱을 위한 예측 가능한 상태 컨테이너
(데이터 바인딩시 상태공유를 하기위해 props로 연속해서 사용하지 않고 한 번만 잘 정의해두면 필요한 파일에서만 간편하게 사용할 수 있다.)
...하지만 나는 아직 간편하지 않다...ㅇㅅㅇ</p>
<p><strong>The Gist!</strong></p>
<p>앱의 상태 전부는 하나의 스토어(store)안에 있는 객체 트리에 저장됩니다. 상태 트리를 변경하는 유일한 방법은 무엇이 일어날지 서술하는 객체인 액션(action)을 보내는 것 뿐입니다. 액션이 상태 트리를 어떻게 변경할지 명시하기 위해 여러분은 리듀서(reducers)를 작성해야 합니다.</p>
<blockquote>
<pre><code class="language-javascript">import { createStore } from &#39;redux&#39;
</code></pre>
</blockquote>
<p>/**</p>
<ul>
<li>이것이 (state, action) =&gt; state 형태의 순수 함수인 리듀서입니다.</li>
<li>리듀서는 액션이 어떻게 상태를 다음 상태로 변경하는지 서술합니다.</li>
<li></li>
<li>상태의 모양은 당신 마음대로입니다: 기본형(primitive)일수도, 배열일수도, 객체일수도,</li>
<li>심지어 Immutable.js 자료구조일수도 있습니다. 오직 중요한 점은 상태 객체를 변경해서는 안되며,</li>
<li>상태가 바뀐다면 새로운 객체를 반환해야 한다는 것입니다.</li>
<li></li>
<li>이 예시에서 우리는 <code>switch</code> 구문과 문자열을 썼지만,</li>
<li>여러분의 프로젝트에 맞게</li>
<li>(함수 맵 같은) 다른 컨벤션을 따르셔도 좋습니다.</li>
<li>/
function counter(state = 0, action) {
switch (action.type) {
case &#39;INCREMENT&#39;:
  return state + 1
case &#39;DECREMENT&#39;:
  return state - 1
default:
  return state
}
}<blockquote>
</blockquote>
// 앱의 상태를 보관하는 Redux 스토어를 만듭니다.
// API로는 { subscribe, dispatch, getState }가 있습니다.
let store = createStore(counter)<blockquote>
</blockquote>
// 업데이트를 직접 구독하거나 뷰 레이어에 바인딩할수 있습니다.
// 보통은 subscribe()를 직접 사용하기보다는 뷰 바인딩 라이브러리(예를 들어 React Redux)를 사용합니다.
// 하지만 현재 상태를 localStorage에 영속적으로 저장할 때도 편리합니다.<blockquote>
</blockquote>
store.subscribe(() =&gt;
console.log(store.getState())
)<blockquote>
</blockquote>
// 내부 상태를 변경하는 유일한 방법은 액션을 보내는 것뿐입니다.
// 액션은 직렬화될수도, 로깅할수도, 저장할수도 있으며 나중에 재실행할수도 있습니다.
store.dispatch({ type: &#39;INCREMENT&#39; })
// 1
store.dispatch({ type: &#39;INCREMENT&#39; })
// 2
store.dispatch({ type: &#39;DECREMENT&#39; })
// 1<pre><code></code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2차 프로젝트를 마치고...]]></title>
            <link>https://velog.io/@ryuwisdom0_o/2%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EB%A7%88%EC%B9%98%EA%B3%A0</link>
            <guid>https://velog.io/@ryuwisdom0_o/2%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EB%A7%88%EC%B9%98%EA%B3%A0</guid>
            <pubDate>Tue, 15 Dec 2020 13:43:38 GMT</pubDate>
            <description><![CDATA[<p>2차 프로젝트가 끝이 났다..
현재 일요일 저녁 9시 40분... 
어제 아침에 대구도착해서 지금까지 (먹고 자고)*2 이제야 쌓였던 피로가 풀리고 눈이 멀쩡하게 떠진다!!🐥 </p>
<p>그리고 오랜만에 내방 침대에서 잤는데...너무 푹신 ㅠ_ㅠ.. 그리웠어..(고시원에서도 엄청 잘잤음..^^)</p>
<p>보자 보자...
10월 19일 위코드 개강.. 12월 11일 2차 프로젝트 종료
약 2달간의 시간 어떻게 흘러간지 모를정도로 위코드 안의 생활에 둘러쌓여있었다. 사실 최근에서야 코로나 확산때문에 다시 뉴스를 찾아보곤 했지만 그동안은 코로나고 뭐고 only 코딩에만 집중! </p>
<p>이틀 전 2차 프로젝트가 끝나고 내일이면 기업협업이 시작된다. </p>
<p>기업협업 전 2차 프로젝트 정리를 하려고 한다. </p>
<ol>
<li>2차 프로젝트에서 느낀점</li>
<li>2차 프로젝트에서 깨달은점</li>
<li>수위의 서재 </li>
<li>앞으로의 방향</li>
</ol>
<ol>
<li>2차 프로젝트에서 느낀점</li>
<li>1차때 PM으로써 팀원을 이끌었다면 2차에서는 완전한 follower가 되었고 조금은 수동적인 자세로 임했던 것 같다.
이유는 모두가 그렇겠지만 체력적으로 조금 지침 + 이참에 잘 따르는 follower가 되어보자..</li>
</ol>
<p>그래서 결과..</p>
<p>follower로써 자가 평가 : 수동적인 태도 반성 필요.. ^^ + 2차 또한 열심히 했지만 1차와 비교해서 살기위해.. 몸을 사렸던 것 같읍니다...
<img src="https://images.velog.io/images/ryuwisdom0_o/post/6b80b854-0685-4dec-96a1-68a156663516/%E1%84%8C%E1%85%A5%E1%86%AB%E1%84%80%E1%85%AA%E1%86%BC%E1%84%85%E1%85%A7%E1%86%AF%20%E1%84%8B%E1%85%A9%E1%84%8B%E1%85%A7%E1%86%AF.jpg" alt=""></p>
<p>~~(핑계 : 체력적 한계 + react 함수형 + styled-components 조합.. 바로 바로 적용/응용시키기 어려움을 느낌 -&gt; 진도 안나감) 멘토님들이 프론트의 고충을 아셨을까 &#39;양 보다 질&#39;이라고 기능 구현에만 급급하지 말고 기능 하나하나 올바르게 적용해보며 코드를 깔끔하게 작성하며 부끄러운 코드를 남기지 말라는 말씀!  </p>
<ol start="2">
<li>2차 프로젝트에서 깨달은점
결과적으로 무사히 프로젝트를 끝마쳤다 생각된다. 하지만 모두 바쁘고 열악한 환경에서 서로 도움을 주고 받으며 꽤 괜찮아 보이게 결과물이 나왔다. 중간 중간 git rebase 이슈로 시간을 꽤 잡아먹었고 git conflict 이슈로 진이 빠진 적도 있었지만 멘토님과 든든한 팀원들의 덕분에 금방 회복하고 다시 페이스를 찾을 수 있었던 것 같다. 하지만 조금 아쉬운 점이라면 내가 좀 더 나서서 프론트 간에 대화를 이끌었다면? 하는 이미 지나간 날에 대한 아쉬움이 든다. 마음 속으론 (사소하지만) 이런 이슈도 공유하면 좋을 것 같다, 이런 파일은 먼저 통일 시키고 시작하면 좋겠는데? 다른 분들은 어떤식으로 routes 경로명 설정하셨지? 등등 이런 생각들이.. &#39;나중에 합쳐볼테니 어차피 알게 될거야&#39;라고 자기 최면을 걸고 내파트에 집중한 것 같다. </li>
</ol>
<p>Dear. 수위의 서재</p>
<p>수희님 - PM이자 수위의 서재 대표님! 갑작스런 코로나 확산과 환경적으로 급격한 변화에서도 침착하게 팀원들을 이끌어주셔서 너무 감사합니다. 
그리고 잊을 수 없는 Suwee의 복지(선릉 산책도 시켜주시고 밥도, 간식도 마구마구 사주시고...)는 과히..최고였다..Suwee는 성과제인데..; 성과(목표량 구현)로 모두 보답하지 못한 것 같아 죄송하고 그럼에도 마지막까지 저희를 북돋아주신 부분 너무 감사합니다. </p>
<p>주민님 - 주민님! 제가 1차때 상세 페이지를 맡아서 도움드리고 싶은 부분이 있었을텐데 제 것 한다고 챙겨드리지 못해서 미안하게 생각하고 그럼에도 알차게 구현하셔서 괜한 염려를 했나 생각했어요! 함께해서 즐거웠습니다! </p>
<p>세원님 - 세원님..랜딩페이지 결과물은 정말 멋졌습니다! 소셜 로그인도 뚝딱! 결제 기능도 뚝딱! (당신 ..그만 잘 해...)그와중에 팀원들도 챙겨주시고..그리고 세원님께 질문하면 과정 하나하나 알려주셔서 이해가 잘되었습니다! 정말 최고였어요! </p>
<p>승진님 - 이전에 저의 첫 코드카타 짝궁이셨던 지니베어님! 제가 백엔드는 아니지만 지니베어님의 명성을 익히 들어서일까요? 서버와 통신할때 안되는 부분 말씀드리면 바로 잠시만요~ 하시고 해결 쏙쏙 ! 든든했습니다! </p>
<p>현석님 - 저의 마니또가 되셔서 1차 플젝때 간식과 커피를 챙겨주셨던 현석님! Suwee에서 저와의 접점은 없었지만 2주동안 동고동락! 즐거웠습니다! </p>
<ol start="4">
<li>앞으로의 방향</li>
</ol>
<p>(작성해야함)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[오구오구 팀 프로젝트 후기 (행복하고 고마웠단 내용♥️)]]></title>
            <link>https://velog.io/@ryuwisdom0_o/%EC%98%A4%EA%B5%AC%EC%98%A4%EA%B5%AC-%ED%8C%80-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9B%84%EA%B8%B0-%EB%8C%80%EC%B6%A9-%ED%96%89%EB%B3%B5%ED%95%98%EA%B3%A0-%EA%B3%A0%EB%A7%88%EC%9B%A0%EB%8B%A8-%EB%82%B4%EC%9A%A9</link>
            <guid>https://velog.io/@ryuwisdom0_o/%EC%98%A4%EA%B5%AC%EC%98%A4%EA%B5%AC-%ED%8C%80-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9B%84%EA%B8%B0-%EB%8C%80%EC%B6%A9-%ED%96%89%EB%B3%B5%ED%95%98%EA%B3%A0-%EA%B3%A0%EB%A7%88%EC%9B%A0%EB%8B%A8-%EB%82%B4%EC%9A%A9</guid>
            <pubDate>Sun, 06 Dec 2020 14:56:19 GMT</pubDate>
            <description><![CDATA[<p>1차 프로젝트가 끝나고 1주일이나 늦게 작성하는 프로젝트 후기.</p>
<p>(시간이 지날수록 미화는 무슨, 기억이 리셋되기 전에 다듬어지지 않은 글로 우선 업로드하겠습니다..)</p>
<p>오구오구를 한마디로 정리하자면</p>
<p>너 무 즐 거 웠 다 !  그리고 정말 많이 웃었다! </p>
<p>중간 중간 시련이 있었지만 사랑스러운 조원들 덕분에 </p>
<p>팀원 중 현지님을 제외한 혜수/성보/승제/민영님은 평소에 대화를 많이 해보지 않았던 분들이였는데 함께하니 우리의 조합은 최고🥰 </p>
<hr>
<p>우리 팀원들에게</p>
<p>나의 뽀야미 1호..2호.. 현지 &amp; 혜수님 </p>
<p>현지님 - 퀸현지.. 무슨 말이 더 필요할까... PM으로써 놓치는 부분이 있다면 챙겨주시고 멘토님이 계시지 않아 어려움을 겪을때 정확한 문제 파악 후 원포인트 레슨까지.. 오구오구가 막힘없이 프로젝트를 진행할 수 있게 힘써주신 현지님. </p>
<p>혜수님 - 1차 프로젝트의 로그인/회원가입 + 장바구니 끝판왕! 이렇게 잘 하면서 ! 못하는척 하기 있기없긔?  해수님께 공감도 많이 받고 서로 위로도 해주고 우리 좀 재밌었는데.. 이제 7층에 있어 ㅠ_ㅠ </p>
<p>든든한 백둥이</p>
<p>성보님 - 마지막날 아침까지 고생해주셨던 성보님..! 나와 상세페이지내 모든 데이터를 함께 했던..! 다른 이커머스와 달리 G9의 product 모델링으로 힘드셨을테도 먼저 맞춰주시려고 했던 성보좌.. 할말이 많았는데.. 지금은 11시 50분 ..신림 꼭 가겠습니다...🤗</p>
<p>승제님 - 나와 상세페이지 내 문의사항 CRUD 과정을 함께 한 승제님! 디테일한 논의 전에 이미 프론트의 flow까지 생각해주셔서 해당폴더의 props대공사를 시키지 않아도 되었다! 정말 아름다운 로직이였다! 내가 조금만 더 잘했다면 게시글 수정/업데이트 기능까지 붙여볼 수 있었을텐데! 나의 파트에 집중하고 있을때 기존의 목표를 클리어 하고 말을 하지않아도 민영님과 함께 이메일 인증번호 추가구현을 하신 건 정말 멋졌다.</p>
<p>민영님 - 민영님 덕분에 너무 든든했던 백엔드! 여전히 백엔드에 대해 모르는 부분이 많지만 오구오구때는 사실 감조차 잡히지 않았는데, 민영님께서 우리 백엔드 멤버들과 논의하시고 회의때마다 알아듣기 쉽게 정리하여 말씀해주셔서 너무 든든했다. 특히 현재 상황과 프론트와의 커뮤니케이션을 굉장히 잘해주셔서 프론트의 내 파트 이외에 서버 통신 상황에 대해 숙지하고 있을 수 있었다. 프로젝트 발표날 잠도 거의 못주무시고 아침 일찍 오셔서 함께 맞춰봐주셨던.</p>
<p>어떻게 표현해야 할지 모를정도로 함께 프로젝트를 진행한 다섯분께 너무 감사한 마음이 크다. 두고 두고 생각 날 것 같다. 어떻게 보면 첫 개발자로써의 프로젝트를 이 멤버들과 함께해서 너무 영광이고 앞으로도 좋은 인연으로 발전되기를 바라본다.</p>
<p>사진 첨부할 것 도 많은데.. 일단 이까지 </p>
<p>업데이트 될 예정입니다..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[O9O9 프로젝트 정리(G9 cloning)]]></title>
            <link>https://velog.io/@ryuwisdom0_o/O9O9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A0%95%EB%A6%ACG9-cloning</link>
            <guid>https://velog.io/@ryuwisdom0_o/O9O9-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A0%95%EB%A6%ACG9-cloning</guid>
            <pubDate>Mon, 30 Nov 2020 20:36:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/69e12ef6-fe47-47cc-8f35-bc837db695cd/O9O9_logo.png" alt=""></p>
<hr>
<h3 id="o9o9오구오구-프로젝트-소개">O9O9(오구오구) 프로젝트 소개</h3>
<hr>
<p><code>1차 클론 프로젝트 아이디어공모</code>에서 <strong><a href="https://www.g9.co.kr/">G9</a></strong>가 선정되어 PM으로써 G9를 모티브로 클로닝 프로젝트를 사랑스러운 팀원들과 12일간 진행하였다.</p>
<p>G9 : <strong><a href="https://namu.wiki/w/eBay">이베이</a> 코리아</strong>가 운영하고 있는 큐레이션 오픈마켓 사이트
<strong>모든 것</strong>이 <strong>깔끔</strong>한 G9, <del>초기 카피는 상술을 버리다, 상식을 채우다</del> (하나 하나 다 맘에 들었어...지구 너..)</p>
<p>프로젝트 진행기간 : 2020년 11월 16일 ~ 2020년 11월 27일</p>
<hr>
<h3 id="기술-스택">기술 스택</h3>
<hr>
<p>▪️** FrontEnd**</p>
<p>   JavaScipt ES6</p>
<p>   React (CRA 초기세팅)</p>
<p>   Sass</p>
<p>▪️** BackEnd**</p>
<p>   Python</p>
<p>   Django</p>
<p>▪️ <strong>공통</strong></p>
<p>   git</p>
<p>   Slack</p>
<p>   Trello</p>
<h3 id="팀원-소개-👫">팀원 소개 👫</h3>
<hr>
<p>▪️ FrontEnd</p>
<p>🌸 <strong>류지혜 (PM)</strong> Product Detail Page</p>
<p>🌺 <strong>김현지</strong> Main Page, Product List Page</p>
<p>🌼 <strong>안혜수</strong> Signin Page, Signup Page, Cart Page</p>
<p>▪️ BackEnd</p>
<p>☘️ <strong>박승제</strong> Login, Signup, Q&amp;A CRUD 구현</p>
<p>🌻 <strong>이민영</strong> Cart CRUD, Email 인증 및 발송 기능 구현</p>
<p>🌹 <strong>이성보</strong> Products Page, Category Page, Product feature 구현</p>
<p>우리 오구오구팀 멤버들 왜이리 다 귀엽나요? 왜죠!? G9폰트처럼 동글 동글 했던 우리. 의견 마찰없이(있었다면 DM Plz...🤗) 모두가 맡은 역할 이상으로 멋진 결과물을 만들어 냈다. 그리고 멋지고도 귀여운 O9O9가 탄생하게 된다.💙</p>
<h3 id="o9o9의-목표-🔥">O9O9의 목표 🔥</h3>
<hr>
<p>우리 프론트엔드와 백엔드 멤버 모두 React, Django를 이용한 첫 프로젝트이다. 외에도 각 파트 로드맵에 따라 다양한 기술과 지식을 쉼 없이 익히며 달려왔다. 이때문에 이커머스 사이트에서 구현할 수 있는 기본 핵심 기능을 구현하며 기초를 다지고 내 것으로 흡수시키는 방향으로 설정하고 <strong>기본</strong>에 집중하며 프로젝트에 임했다. (차후 이 부분은 나 포함 팀원들이 초기 부담을 덜게되어 능률이 더욱 올라갔고, 추가 기능까지 구현하며 좋은 성과를 낼 수 있었다 생각한다! )</p>
<h3 id="마치-내-성격과-같은-agile하게-👊">마치... 내 성격과 같은 Agile하게... 👊</h3>
<hr>
<p>성격따라 개발 프로세스도 애자일로<del>^^ ~</del>(원래부터 애자일로 방법론으로 설정됨)~~, 대신에 끝없는 소통... 
그때 그때 끝없는 소통이지만, 공식 소통시간을 오전・오후 하루 2번 진행하였다. 
프론트/백은 이슈 발생시 그때 그때 공유하더라도 팀원 모두가 거의 수면시간을 제외하고 작업에 매진했기 때문에(그만큼 하루동안 변경사항과 결정사항을 논의해야 할 텀이 짧았다.), 사소한 점이라도 서로에게 공유를 하고 넘어가자는 의미에서 모든 회의는 길지않게 각자 진도, 오늘의 구현 목표, 각 파트 이슈 및 변경사항 정도로 간결하게 진행되었고, 저녁회의 마치고는 팀원들과 씐나는 탁구...^^ 너무나 재미있었다... refresh하고 다시 코딩모드 </p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/5693cec2-a751-4899-8017-07561fa25e91/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-12-01%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%205.21.59.png" alt=""></p>
<h2 id="-프로젝트-결과물">### 프로젝트 결과물</h2>
<hr>
<p><a href="https://www.youtube.com/watch?v=-CVUZh76sdc">상품 디테일 페이지 보러가기</a></p>
<h3 id="👩💻-상세-페이지">👩‍💻 상세 페이지</h3>
<p>☑️ 담당 구현 기능</p>
<p>▸ 상품 상세 페이지
    : REST Api를 사용해 서버를 통신하여 상품 리스트 렌더링
    : 상세 페이지 내 메뉴 Tab 기능 생성 / 문의하기 탭 CRUD 및 출력 기능 구현
    : State관리를 통한 찜하기 및 수량에 따른 가격 변경 기능구현
    : 각 기능을 모두 개별의 컴포넌트로 구현 후 부모 컴포넌트에서의 상태관리</p>
<p>▸ 메인페이지 상단 nav바 , Footer 구현  :  로그인  실행 유무에 따른 상태 변경 기능 구현</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[지혜라는 이름]]></title>
            <link>https://velog.io/@ryuwisdom0_o/%EC%A7%80%ED%98%9C%EB%9D%BC%EB%8A%94-%EC%9D%B4%EB%A6%84</link>
            <guid>https://velog.io/@ryuwisdom0_o/%EC%A7%80%ED%98%9C%EB%9D%BC%EB%8A%94-%EC%9D%B4%EB%A6%84</guid>
            <pubDate>Sun, 29 Nov 2020 10:42:29 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[My Story]]></title>
            <link>https://velog.io/@ryuwisdom0_o/My-Story</link>
            <guid>https://velog.io/@ryuwisdom0_o/My-Story</guid>
            <pubDate>Sat, 28 Nov 2020 10:06:01 GMT</pubDate>
            <description><![CDATA[<p>오픈된 곳에 처음 써보는 나의 이야기 😶</p>
<p>특별할 것 없지만 머리속은 이미 long story..😶</p>
<p>처음에는 간단하게  쓰려고 했는데 내 이름에 대해 쓰고 있는 나를 발견.....</p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/91dafc02-42fd-4a46-bc0a-e4d3d780d154/%E1%84%87%E1%85%A9%E1%84%82%E1%85%A9%E1%84%87%E1%85%A9%E1%84%82%E1%85%A9.jpeg" alt=""></p>
<p>그래서 하나씩 짧게 나누어 작성하려 한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React에서 input 사용]]></title>
            <link>https://velog.io/@ryuwisdom0_o/React%EC%97%90%EC%84%9C-input-%EC%82%AC%EC%9A%A9</link>
            <guid>https://velog.io/@ryuwisdom0_o/React%EC%97%90%EC%84%9C-input-%EC%82%AC%EC%9A%A9</guid>
            <pubDate>Sun, 22 Nov 2020 14:16:46 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>참고: 크롬에서 테스트한 결과로 디테일한 현상은 타 브라우저와 다를 수 있습니다. 그리고 테스트 코드는 typescript 기반으로 제작되었는데, 인자 값을 any 타입으로 정의한 것은 테스트 코드를 간소화하기 위한 것으로 실제로는 타입에 맞게 지정해 주어야합니다.</p>
</blockquote>
<h3 id="1-jsx-태그에-등록하는-이벤트-리스너는-네이티브-이벤트가-아니다">1. jsx 태그에 등록하는 이벤트 리스너는 네이티브 이벤트가 아니다.</h3>
<p>jsx 태그에 onMouseDown, onClick, onChange 같은 이벤트 리스너를 등록할 수 있는데, 이 이벤트들은 네이티브 이벤트가 아니다. Mouse 이벤트의 경우 네이티브 마우스 이벤트 정보를 담고 있는 Class 객체로 들어오고, onChange 이벤트의 경우에는 네이티브 change 이벤트 정보를 담고 있는 SyntheticEvent 객체로 들어온다. 특히 change 이벤트 같은 경우 네이티브 이벤트와 동작이 다른데, 네이티브 이벤트는 포커스 아웃이 됐을 때 사용자 입력이 완료되었다고 인식하여 change 이벤트가 발생하는 반면 react의 change 이벤트는 인풋에 텍스트가 입력되어 변경이 생기면 발생한다. 크롬기준으로 봤을 때 input 이벤트와 비슷하다.</p>
<p>react 태그에 직접 이벤트 핸들러를 등록</p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/7db16eab-26c4-4bde-a77a-22fc112bd45c/input1.png" alt=""></p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/56ed440b-c07e-4371-8658-113ca720108b/input2.png" alt=""></p>
<p>네이티브 이벤트 등록</p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/3ce05d67-9624-4852-85c9-2ab63d2a4514/input3.png" alt="">
<img src="https://images.velog.io/images/ryuwisdom0_o/post/a4bb692b-401b-4c4c-aa81-99b74bd6ad79/input4.png" alt=""></p>
<h4 id="2-input-엘리먼트에-value-속성을-지정하면-인풋값이-변경되지-않는다">2. input 엘리먼트에 value 속성을 지정하면 인풋값이 변경되지 않는다.</h4>
<p>아래처럼 value 속성을 지정해 두면 이 엘리먼트는 value 값에 의해서만 값이 변경된다는 전제가 생기기때문에 사용자가 값을 입력해도 input은 변경되지 않는다.</p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/d65a2502-ebb5-4929-b08a-fd668970b2e9/input5.png" alt=""></p>
<p>그래서 인풋창의 값을 업데이트하기 위해서는 props나 state 값을 바인딩하여 render 함수를 통해 업데이트 해야한다.</p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/c39994ea-c420-46b8-bfe8-1b90a4b353d0/input6.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[동적 라우팅(Dynamic Routing)]]></title>
            <link>https://velog.io/@ryuwisdom0_o/%EB%8F%99%EC%A0%81-%EB%9D%BC%EC%9A%B0%ED%8C%85Dynamic-Routing-3d3j87o3</link>
            <guid>https://velog.io/@ryuwisdom0_o/%EB%8F%99%EC%A0%81-%EB%9D%BC%EC%9A%B0%ED%8C%85Dynamic-Routing-3d3j87o3</guid>
            <pubDate>Sun, 22 Nov 2020 14:00:57 GMT</pubDate>
            <description><![CDATA[<h4 id="동적라우팅이란">동적라우팅이란?</h4>
<p>라우트의 경로에 특정 값을 넣어 해당 페이지로 이동할 수 있게 하는 것.(Dynamic Routing)</p>
<p>React Router에서는 두 가지 방법을 통해 유동 라이팅 기능을 구현할 수 있습니다.</p>
<ol>
<li>Query parameters</li>
<li>URL parameters</li>
</ol>
<h4 id="라우트로-설정한-컴포넌트의-3가지-props">라우트로 설정한 컴포넌트의 3가지 props</h4>
<p><strong>### 1. history</strong>
이 객체를 통해 다른 경로로 이동하거나 앞, 뒤페이지로 전환할 수 있습니다.</p>
<p><strong>2. location</strong>
이 객체는 현재 경로에 대한 정보를 지니고 있고, URL 쿼리에 대한 정보도 가지고 있습니다.</p>
<p><strong>3. match</strong>
이 객체에는 어떤 라우트에 매칭이 되어있는지에 대한 정보가 있고, params 정보를 가지고 있습니다.</p>
<h4 id="query-parameters">Query parameters</h4>
<p><strong>location</strong></p>
<p>this.props.location을 통해서 URL 주소의 정보를 가지고 올 수 있습니다.</p>
<p>해당 URL에서 필요한 key값을 추출하여, 백엔드와 데이터 통신을 하고, 백엔드와 통신한 데이터로 원하는 정보를 페이지에 담을 수 있습니다.</p>
<h4 id="url-parameters">URL parameters</h4>
<p><strong>match</strong></p>
<p>params 정보는 this.props.match.params를 통해 가지고 올 수 있습니다.
params 데이터를 사용하기 위해서는 Route.js에서 라우트 설정을 조금 수정해야 합니다.
Route exact path 뒤에 /:id를 붙여주면 해당 컴포넌트에서 this.props.match.params.id를 통해 해당 값을 가지고 올 수 있습니다.</p>
<h4 id="string-parameters-vs-query-parameters">String parameters VS Query parameters</h4>
<p><strong>String parameters</strong></p>
<p>해당 페이지에서 여러 정보가 필요한 경우
Query parameters를 사용할 경우, routes.js를 수정해야 하기 때문에 유지 보수 측면에서 좋지 않다고 판단될 경우
필터링을 하고 싶은 경우
Query parameters</p>
<p>특정한 resource를 식별하고 싶은 경우. 즉, 하나만 딱 필요한 경우.
/users // 사용자 전체의 목록을 가져온다.
/users/123 // id 값이 123인 사용자를 가져온다.
/users?job=programer // 필터링 &gt;&gt;&gt; 직업이 프로그래머인 사용자 목록만 가져온다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[위코드 한 달 후기]]></title>
            <link>https://velog.io/@ryuwisdom0_o/%EC%9C%84%EC%BD%94%EB%93%9C-%ED%95%9C%EB%8B%AC-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@ryuwisdom0_o/%EC%9C%84%EC%BD%94%EB%93%9C-%ED%95%9C%EB%8B%AC-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 15 Nov 2020 14:32:14 GMT</pubDate>
            <description><![CDATA[<h3 id="wecode-한-달-후기">wecode 한 달 후기</h3>
<p>유치원 첫 등원 하는 기분으로 화창한 테헤란로 아침 햇볕을 받으며 던킨도나스 앞 횡단보도를 룰루랄라 건넜던 기억이 엊...엊그제 같은데...
<img src="https://images.velog.io/images/ryuwisdom0_o/post/74f1d1fa-1d00-40ba-96fc-73e94755ed7e/!!.gif" alt=""></p>
<p>얼굴을 외웠지만 이름과 매칭시키는 과정에서 이름이 기억안나 부르진 못하고 이름없이 자연스럽게 부르려고 했던 순간도,
라운지가 낯설어 강의실에서 눌어앉아 코드치던 시간도 순삭...😳</p>
<p>이젠 거의 주말까지 4주 내내 붙어서 얼굴을 마주보니 대부분 14기 동기들을 한 3개월 정도 알고 지낸 것 같은 느낌이 들만큼 익숙하다.. 그리고 영주님 말처럼 한 달 뒤에 헤어진다 생각하니 벌써 눈물 뚝(ㅠ_ㅠ.. 생각보다 정많은 스탈❄️)</p>
<p>대략 프론트앤드 기준 이번주 까지의 4주 루틴은 아래와 같다.</p>
<p>🌟 첫째주 : HTML/CSS/Javascript 문제를 풀며 친해지기
🌟 둘째주 : 하루에 하나씩 짝꿍과 알고리즘 문제를 풀고, HTML/CSS/Javascript로 인스타그램을 구현해본다. 쉽지 않지만 다 하게 되어있다.
🌟 셋째주 : HTML/CSS/Javascript를 사용해 만든 인스타그램을 SPA로 CRA환경으로 세팅해 react로 구현한다. + SCSS포함..^^ 이게 될까 싶지만 된다...^^ 갓 위코드와 위대한 동기들...!   
🌟 넷째주 : 전 주에 react로 구현한  인스타그램을 조별 git repository에 PR하고 공용 컴포넌트와 mock데이터도 적용해보고 서로 리뷰도 주고 받았다. 내가 누구에게 리뷰를 남기다니... 그리고 멘토 리뷰도 받고 리팩토링 진행! 
이후에 리뷰 반영 후 조끼리 readme작성 후 일단 한숨을 돌린다... 그리고 멘토님들이 merge까지 해주시면... 종료!  </p>
<p>➕ 중간 중간 진행된 수업들</p>
<ul>
<li>웹 서비스의 역 개발자 도구, HTTP, 리눅스 &amp; 터미널 사용법, 데이터 베이스와 모델링, 인증 &amp; 인가...
제목만 적어보았지만... 어떻게 이걸 다 소화했나..(우선은 다 소화했다 생각하고 싶다.^^) </li>
</ul>
<h4 id="리액트">리액트</h4>
<p>리액트 특히 ...리액트 특징이 어렵다라는 거라는데...컴포넌트 나누는 것 부터 너무 낯설었다. 
State와 Props도 알듯 말듯.. 하지만 인스타그램 클론이 종료될때쯤 보인다 보여!! +_+!!!
천천히 느리지만 분명 하루하루 성장하며 나아가고 있으니 걱정은 하지 않을 것이다. 
지금, 그리고 앞으로 더 몰입하여 리액트를 꼭 끝장낼 수 있도록... 하겠다... </p>
<p>눈 깜짝 할 사이에 한달이 흘렀다. 
느끼는 점은 어렵고 어렵다.. 이해하려고 하는데 이해가 안되서 머리가 지끈지끈 아프고 우울한 날도 있었다. 
하지만 너무 즐겁다! 될 것 같다!  아무 걱정없이 내가 하고싶은 공부를 하는 현재..얼마나 소중하고 행복한 시간인가..
그렇지만 이 시간 조차 그냥 주어진게 아니기에 이 소중한 시간을 더욱 알차게 쓰도록!  
다시 한 번 개발자의 길을 선택한 나에게 쓰담쓰담해주고 싶다... 그리고 응원해주는 엄마 아빠 오빠 사랑해🧡  </p>
<p>분명 위코드 시작 전 사전 스터디 나의 홈페이지 만들기 과제에서 
<img src="https://images.velog.io/images/ryuwisdom0_o/post/2d873cdd-708a-4f4a-a2a7-2aab91b1efa1/%E1%84%80%E1%85%A1%E1%86%AF%E1%84%85%E1%85%B5%E1%84%80%E1%85%B5.png" alt=""></p>
<p>갈려질 만큼 하자 했는데... 과연 내가 갈려질 만큼 한걸까? 100을 쏟아 부었는가?  아니다.
체력은 매일 워워크 계단오르기로 유지(?) 하고 있고, 이제 1차 프로젝트 시작 때 갈릴거야... </p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/9e7397e4-7b79-4bdc-95f1-d79363e7c603/%E1%84%8C%E1%85%A1%E1%84%8B%E1%85%A1%E1%84%87%E1%85%AE%E1%86%AB%E1%84%8B%E1%85%A7%E1%86%AF.jpg" alt=""></p>
<h3 id="1차-프로젝트를-앞두고-느끼는-점">1차 프로젝트를 앞두고 느끼는 점</h3>
<p>원하는 클론 프로젝트 사이트를 발표할 때 나는 나의 애정하는 사이트 G9를 발표했다. 깔끔하면서도 귀욤귀욤한 UI, 고민하지 않아도 되는 제품 퀄러티, 모두 무료 배송 &amp; 무료 반품, 그리고 동글동글 로고와 상큼한 테마컬러!! </p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/fea82f11-544a-4776-a26a-b5795c3d3fae/g9%E1%84%89%E1%85%A9%E1%84%80%E1%85%A2.jpeg" alt=""></p>
<p>그리고 감사하게도 G9가 클론 프로젝트 리스트에 선정이 되었다! (사실 될 줄 알았음. 왜냐면 이커머스 사이트중에 G9만큼 편안하고 직관적이고 심플한 곳이 있나 ^^ + 그리고 여유만 된다면 프론트와 백에서 구현해볼 것 천지인 이커머스!)
<img src="https://images.velog.io/images/ryuwisdom0_o/post/4b3ffdd5-ec79-477f-9351-ca5a11590ab3/22%E1%84%91%E1%85%AD.png" alt=""></p>
<p>관건은 1차에 할 것인가 2차에 할 것인가.... 나의 감은 1차..응 당첨...^^ 그럴 것 같아.. 
<img src="https://images.velog.io/images/ryuwisdom0_o/post/cb321bbe-f0da-4567-9a1a-d48011993a94/%E1%84%86%E1%85%AE%E1%84%86%E1%85%B5%E1%86%AB%20%E1%84%92%E1%85%A2%E1%84%90%E1%85%A1%E1%86%AF.png" alt=""></p>
<p>급 포스팅 종료... (수정은 나중에)</p>
<p>마지막으로 
미래의 함께할 팀멤버분들께,
미리 잘 부탁드립니다.. 우리 G9.. 최강의 조를 만들겝니다... </p>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/3e6764c9-b00b-4f18-a369-b94aecf7bddc/%E1%84%8B%E1%85%A8%E1%84%89%E1%85%A1%E1%86%BC%E1%84%8B%E1%85%B5%E1%84%83%E1%85%AC%E1%86%B8%E1%84%82%E1%85%B5%E1%84%83%E1%85%A1.jpeg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[fetch 🐾]]></title>
            <link>https://velog.io/@ryuwisdom0_o/fetch</link>
            <guid>https://velog.io/@ryuwisdom0_o/fetch</guid>
            <pubDate>Sat, 14 Nov 2020 12:15:09 GMT</pubDate>
            <description><![CDATA[<p>목차</p>
<ol>
<li>fetch() </li>
<li>fetch함수를 사용해 backend API붙이기</li>
</ol>
<p>Ajax의 포스팅은 <a href="https://velog.io/@ryuwisdom0_o/Ajax">요기</a>에서 🐙</p>
<p>두근두근 +_+ ! 
오늘은 backend분들이 만든 데이터 모델을 fetch함수를 통해 내가 만든 위스타그램 로그인창에서 유효성 체크를 해보는 시간을 가졌다. 그리고 유효한 값을 넘기면 받을 수 있는 귀여운 토큰들도 받았다! </p>
<h3 id="1-fetch-">1. fetch() ??</h3>
<p>1-1. fetch의 기능</p>
<ul>
<li>서버가 응답할 때 까지 다른일을 할 수 있도록 도와주는 메서드</li>
<li>fetch()안에 들어가는 인자값만 서버 응답이 끝난 후 실행되고, 나머지 요소들은 서버응답과 상관없이 실행한다.</li>
<li><blockquote>
<p>그렇다! 비동기(Asynchronous)이다!</p>
</blockquote>
</li>
</ul>
<p>*<em>기본 문법 *</em></p>
<blockquote>
<pre><code class="language-javascript">let promise = fetch(url, [options])</code></pre>
</blockquote>
<p>```</p>
<p>response / request header부분은 별도로 다루지 않겠다.</p>
<p><strong>함수 설명</strong></p>
<blockquote>
<ul>
<li>GET 이외의 요청을 보내려면 추가 옵션을 사용해야 한다.</li>
</ul>
</blockquote>
<ul>
<li>method : GET, POST, PATCH 등 http method를 입력한다.</li>
<li>body : 문자열(예 : JSON)</li>
<li>통신을 할 때는 <code>string</code> 형태의 JSON으로 보내야 하기 때문에  <code>JSON.stringify()</code>라는 메서드를 활용해서 포맷을 기존의 Object에서 String으로 변환해준다.</li>
<li>통신은 다른 로직에 비해 오래 걸리기 때문에 비동기 처리돼서 then 메서드를 사용한다.</li>
</ul>
<h3 id="2-fetch함수를-사용해-backend-api불러오기">2. fetch함수를 사용해 backend API불러오기</h3>
<blockquote>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/618243be-ad07-42fd-a8d1-e24dbbbd4cbc/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.00.42.png" alt="">backend에서 작업한 데이터 모델이 들어있는 서버 주소를 API라는 변수로 지정해두고😃, fetch함수를 사용해 통신을 시작한다.</p>
<p>아래 코드에서
첫 번째 then에서는 server에서 보내준 response를 Object 형태로 변환해주고
두 번째 then에서는 object로 변환한 response를 console.log로 확인한다.
여기서 원하는 로직을 구현하면 된다!
<img src="https://images.velog.io/images/ryuwisdom0_o/post/519b3059-4d07-4072-b526-2f0c68f1efe2/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-14%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.02.13.png" alt="">fetch함수 내 body부분의 항목은 backend에서 지정한 key와 일치해야한다.(데이터 type확인 유의!!)</p>
<p>위의 Authorization은 상대 backend분의 key값과 일치하면 우선 나의 local storage에 담기게 되는데 미처 그것까지 확인하지 못하여 첫 토큰들을 다 캡쳐해버렸다...😄</p>
</blockquote>
<blockquote>
<p><img src="https://images.velog.io/images/ryuwisdom0_o/post/35bd5d70-f8d7-4e14-94a4-8684b5ca71ad/%E1%84%90%E1%85%A9%E1%84%8F%E1%85%B3%E1%86%AB1.png" alt=""><img src="https://images.velog.io/images/ryuwisdom0_o/post/9e7c5352-03e5-4945-9f99-6e651e7e231a/%E1%84%90%E1%85%A9%E1%84%8F%E1%85%B3%E1%86%AB2.png" alt=""><img src="https://images.velog.io/images/ryuwisdom0_o/post/08eb4905-b6a4-435f-a927-960af6fc1a17/%E1%84%90%E1%85%A9%E1%84%8F%E1%85%B3%E1%86%AB3.png" alt=""><img src="https://images.velog.io/images/ryuwisdom0_o/post/5a5dd0fa-0a7d-48b0-873b-85d4a5ccfb22/%E1%84%90%E1%85%A9%E1%84%8F%E1%85%B3%E1%86%AB4.png" alt=""></p>
</blockquote>
<p>콘솔창에 찍힌 값들이 뭐라고.. 왜이렇게 귀엽니!! 너희들🥲 &nbsp; 앞으로 안전하게 보관해줄게💛</p>
<p>전달받은 토큰들을 안전하게 관리할 수 있도록 <strong>JWT</strong>(존맛탱 아님)에 대해서도 학습할 예정이다! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Mock Data 🐾]]></title>
            <link>https://velog.io/@ryuwisdom0_o/Mock-Data</link>
            <guid>https://velog.io/@ryuwisdom0_o/Mock-Data</guid>
            <pubDate>Thu, 12 Nov 2020 18:13:39 GMT</pubDate>
            <description><![CDATA[<h3 id="1-mock-data">1. <strong>mock data</strong></h3>
<ol>
<li>mock data란?</li>
</ol>
<blockquote>
<ul>
<li>mock: 거짓된, 가짜의</li>
</ul>
</blockquote>
<ul>
<li>이름에서 알 수 있듯이 mock data 는 가짜 데이터, 샘플 데이터</li>
<li>즉, 실제 API 에서 받아온 데이터가 아닌 프론트앤드 개발자가 필요에 의해 샘플용으로 만든 데이터 </li>
</ul>
<ol start="2">
<li>mock data가 필요한 이유</li>
</ol>
<blockquote>
<ul>
<li><p>API 가 아직 준비중인 경우</p>
<p>:: 프로젝트 진행 시 API가 나오기 이전에 페이지 레이아웃이 먼저 나오는 경우가 많다. 이러한 경우에는 백엔드에서 API가 나올 때까지 무작정 기다리는 게 아니라, mock data를 만들어 데이터가 들어오는 상황을 미리 대비하고 UI가 기획에 맞게 구현되는지 먼저 확인해야 한다.</p>
</li>
</ul>
</blockquote>
<ul>
<li>Backend 와의 원활한 의사소통을 위함<blockquote>
</blockquote>
  :: 주고 받는 데이터가 어떤 형태인지, key-value 값을 미리 맞춰볼 수 있다.</li>
</ul>
<h3 id="2-mock-data-관리-방법">2. <strong>mock data 관리 방법</strong></h3>
<h3 id="datajs--datajson"><strong>data.js &amp; data.json</strong></h3>
<h4 id="📂-datajs">📂 data.js</h4>
<p><strong><em>🧷 data.js 위치</em></strong>
해당 컴포넌트 바로 옆에 만들어서, 바로 접근하기 쉽게!</p>
<blockquote>
<pre><code class="language-jsx">const SlickData = [
  {
    id: 1,
    skills: &quot;HTML&quot;
  },
  {
    id: 2,
    skills: &quot;CSS&quot;
  },
  {
    id: 3,
    skills: &quot;JavaScript&quot;
  },
  {
    id: 4,
    skills: &quot;React&quot;
  },
  {
    id: 5,
    skills: &quot;React Native&quot;
  },
  {
    id: 6,
    skills: &quot;Angular&quot;
  },
  {
    id: 7,
    skills: &quot;Vue&quot;
  },
  {
    id: 8,
    skills: &quot;Redux&quot;
  },
  {
    id: 9,
    skills: &quot;TypeScript&quot;
  }
];
</code></pre>
</blockquote>
<p>export default SlickData;</p>
<pre><code>
**_🧷 app.js_**
&gt;```jsx
import React from &#39;react&#39;;
import DATA from &#39;data.js&#39;;</code></pre><h4 id="📂-datajson">📂 data.json</h4>
<p><strong><em>🧷 data.json 위치</em></strong></p>
<ul>
<li>public 폴더 &gt; data 폴더 &gt; data.json</li>
</ul>
<p><strong><em>🧷 data.json</em></strong></p>
<blockquote>
<pre><code class="language-json">{
  &quot;data&quot;: [
    {
      &quot;id&quot;: 1,
      &quot;name&quot;: &quot;yang&quot;,
      &quot;age&quot;: 30
    },
    {
      &quot;id&quot;: 2,
      &quot;name&quot;: &quot;kim&quot;,
      &quot;age&quot;: 29
    }
  ]
}</code></pre>
</blockquote>
<pre><code>
**_🧷 app.js_**

&gt; ```javascript
import React, { Component } from &#39;react&#39;
&gt;
export class Main extends Component {
  constructor(){
    super();
    this.state = {
      data: []
    };
  }
&gt;
  componentDidMount = () =&gt; {
    fetch(&#39;http://localhost:3002/data/data.json&#39;)
      .then(res =&gt; res.json())
      .then(res =&gt; {
        console.log(&quot;firstly: &quot;, res.data)
        this.setState({
          data: res.data
        }, () =&gt; {
          console.log(&quot;secondly: &quot;, this.state.data)
        })
  })
}
&gt;
  render() {
    console.log(&quot;thirdly: &quot; , this.state.data)
    return (
      &lt;div&gt;
        hello
      &lt;/div&gt;
    )
  }
}
&gt;
export default Main</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[라이프사이클 메서드 🐾]]></title>
            <link>https://velog.io/@ryuwisdom0_o/%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%A9%94%EC%84%9C%EB%93%9C</link>
            <guid>https://velog.io/@ryuwisdom0_o/%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4-%EB%A9%94%EC%84%9C%EB%93%9C</guid>
            <pubDate>Tue, 10 Nov 2020 16:01:20 GMT</pubDate>
            <description><![CDATA[<h1 id="라이프사이클-♺">라이프사이클 ♺</h1>
<p>모든 리액트 컴포넌트에는 라이프사이클(수명 주기)이 존재한다. 컴포넌트의 수명은 페이지가 렌더링되기 전인 준비 과정에서 시작하여 페이지에서 사라질 때 끝난다.</p>
<p>프로젝트 진행 시 가끔 컴포넌트를 처음 랜더링할 때 어떤 작업을 처리해야하거나 컴포넌트를 업데이트하기 전후로 어떤 작업을 처리해야 할 수도 있고, 또 불필요한 업데이트를 방지해야 할 수도 있다.</p>
<p>이떄 컴포넌트의 라이프사이클 메서드를 사용한다.</p>
<p>참고로 라이프사이클 메서드는 클래스형 컴포넌트에서만 사용할 수 있다. 
함수형 컴포넌트에서는 사용할 수 없고 그 대신에  <code>Hooks</code> 기능을 사용하여 비슷한 작업을 처리한다.</p>
<p>라이프 사이클 멧서드의 종류는 아래와 같이 총 아홉가지이다.</p>
<p><strong>Will</strong>접두사가 붙은 메서드는 어떤 작업을 작동하기 <strong>전</strong>에 실행되는 메서드 이고,
<strong>Did</strong>접두사가 붙은 메서드는 어떤 작업을 작동하기 <strong>후</strong>에 실행되는 메서드 이다.</p>
<p>이 메서드들을 우리가 컴포넌트 클래스에서 덮어 써 선언함으로써 사용할 수 있다.</p>
<p>라이프사이클은 총 세가지 즉 <strong>마운트</strong>, <strong>업데이트</strong>, <strong>언마운트</strong> 카테고리로 나눈다. </p>
<h3 id="📍-마운트">📍 마운트</h3>
<p>DOM이 생성되고 웹 브라우저상에 나타나는 것이 마운트(mount)</p>
<blockquote>
<table>
<thead>
<tr>
<th>Method</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td><code>constructor</code></td>
<td>컴포넌트를 새로 만들 때마다 호출되는 클래스 생성자 메서드<br />초기 <code>state</code>를 정할 수 있다.</td>
</tr>
<tr>
<td><code>getDerivedStateFromProps</code></td>
<td>props에 있는 값을 state에 넣을 때 사용하는 메서드<br />props로 받아온 값을 state에 동기화시키는 용도로 사용</td>
</tr>
<tr>
<td><code>render</code></td>
<td>우리가 준비한 UI를 랜더링하는 메서드</td>
</tr>
<tr>
<td><code>componentDidMount</code></td>
<td>컴포넌트가 웹 브라우저상에 나타난 후 호출하는 메서드<br />컴포넌트를 만들고 첫 헨더링을 다 마친 후 실행<br /><br />최초 한 번 실행<br />이 안에서 다른 JS라이브러리 또는 프레임워크의 함수를 호출하거나 이벤트 등록, setTimeout, setInterval, 네트워크 요청 같은 비동기 작업을 처리하면 된다.</td>
</tr>
</tbody></table>
</blockquote>
<h3 id="📍-업데이트">📍 업데이트</h3>
<p>컴포넌트가 다음의 경우에 업데이트한다.</p>
<ul>
<li><code>props</code>가 바뀔 때</li>
<li><code>state</code>가 바뀔 때</li>
<li>부모 컴포넌트가 리렌더링될 때</li>
<li><code>This.forceUpdate</code>로 강제로 렌더링을 트리거할 때</li>
</ul>
<blockquote>
<table>
<thead>
<tr>
<th>Method</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td><code>getDerivedStateFromProps</code></td>
<td>이 메서드는 마운트 과정에서도 호출되며,<br />업데이트가 시작되기 전에도 호출된다. props의 변화에 따라 state값에도 변화를 주고 싶을 때 사용한다.</td>
</tr>
<tr>
<td><code>shouldComponentUpdate</code></td>
<td>컴포넌트가 리렌더링을 해야 할지 말아야 할지를 결정하는 메서드<br />이 메서드는 <code>true</code>또는 <code>false</code>값을 반환해야 하며, <code>true</code>를 반환하면 다음 라이프사이클이 계속 실행되고, <code>false</code>를 반환하면 작업을 중지한다. 즉 컴포넌트가 리렌더링 되지않는다. <br />만약 특정함수에서 <code>This.forceUpdate()</code>함수를 호출한다면 이 과정을 생략하고 바로 <code>render</code>함수를 호출한다.</td>
</tr>
<tr>
<td><code>render</code></td>
<td>컴포넌트를 리렌더링한다.<br />라이프사이클 중 유일한 <strong>필수 메서드</strong></td>
</tr>
<tr>
<td><code>getSnapshotBeforeUpdate</code></td>
<td>컴포넌트 변화를 DOM에 반영하기 바로 직전에 호출하는 메서드</td>
</tr>
<tr>
<td><code>componentDidUpdate</code></td>
<td>컴포넌트의 업데이트 작업이 끝난 후 호출하는 메서드</td>
</tr>
</tbody></table>
</blockquote>
<h3 id="📍-언마운트">📍 언마운트</h3>
<p>마운트의 반대 과정, 즉 컴포넌트를 DOM에서 제거하는 것이 언마운트(unmount)</p>
<blockquote>
<table>
<thead>
<tr>
<th>Method</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td><code>componentWillUnmount</code></td>
<td>컴포넌트가 웹 브라우저상에서 사라지기 전에 호출하는 메서드</td>
</tr>
</tbody></table>
</blockquote>
<p>라이프사이클 메서드는 컴포넌트 상태에 변화가 있을 때마다 실행하는 메서드입니다.이 메서드들은 서드파이 라이브러리를 사용하거나 DOM을 직접 건드려야 하는 상황에서 유용하다. 추가로 컴포넌트 업데이트의 성능을 개선할 때는 <code>shouldComponentdate</code>가 중요하게 사용된다. </p>
<p>각 메서드 설명은 추가적으로 하겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SPA & Router 🐾]]></title>
            <link>https://velog.io/@ryuwisdom0_o/SPA-Router</link>
            <guid>https://velog.io/@ryuwisdom0_o/SPA-Router</guid>
            <pubDate>Tue, 10 Nov 2020 15:59:54 GMT</pubDate>
            <description><![CDATA[<h2 id="spa">SPA</h2>
<p>: Single Page Application
: 말 그대로 한 개의 페이지로 이루어진 애플리케이션을 의미</p>
<p>기존에는 사용자가 다른 페이지로 이동할 때마다 새로운 html을 받아 오고, 페이지를 로딩할 때 마다 서버에서 리소스를 전달받아 해석한 뒤 화면에 보여주었다. 이렇게 사용자에게 보이는 화면은 서버 측에서 준비했다. </p>
<p>현재 웹에서 제공되는 정보가 무수히 많이 때문에 새로운 화면마다 서버 측에서 모든 뷰를준비한다면 성능상 문제가 발생할 수 있다.트래픽이 너무 많이 나오거나 불필요한 로딩이 많이 생기거 등등</p>
<p>그래서 리액트 같은 라이브러리 혹은 프레임워크를 사용하여 뷰 렌더링을 사용자의 브라우저가 담당하도록 하고, 우선 애플리케이션을 브라우저에 불러와서 실행시킨 후에 사용자와의 인터렉션이 발생하면 필요한 부분만 자바스크립트를 사용하여 업데이트해준다. 새로운 데이터가 필요하다면 서버 API를 호출하여 필요한 데이터만 새로 불러와 애플리케이션에서 사용할 수 있다. </p>
<h4 id="spa의-단점">SPA의 단점</h4>
<p> 앱의 규모가 커지면 자바스크립트 파일이 너무 커진다는 것 (페이지 로딩 시 사용자가 실제로 방문하지 않을 수도 있는 스크립트도 불러오기 때문) but 앞으로 배울 코드 스플리팅(code spliting)을 사용하면 라우트별로 파일들을 나누어 트래픽과 로딩 속도를 개선할 수 있다! </p>
<ul>
<li>~~blabla 이해해야하는 부분.  서버 사이드 렌더링(server-side-rendering)를 통해 모두 해결할 수 있다. </li>
</ul>
<h2 id="router">Router</h2>
<p>: 다른 주소에 다른 화면을 보여 주는 것을 라우팅이라고 한다.
: 어떤 주소에 어떤 UI를 보여줄지 규칙을 정하는 작업
: 과거에는 서버에서 관리하는 로직이였지만 이제는 클라이언트 사이드에서 아주 간단하게 구현할 수 있다.
: 한개의 웹페이지(html)안에서 여러 개의 페이지를 보여주는 방법이 Routing</p>
<p>리액트 라이브러리 자체에는 이 기능이 내장되어 있지는 않다. 그 대신 브라우저의 API를 직접 사용하여 이를 관리하거나, 라이브러리를 사용하여 이 작업을 더욱 쉽게 구현할 수 있다. </p>
<p>리액트 라우팅 라이브러리는 리액트 라우터(react-router), 리치 라우터(reach-router), Next.js등이 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Props 🐾]]></title>
            <link>https://velog.io/@ryuwisdom0_o/Props</link>
            <guid>https://velog.io/@ryuwisdom0_o/Props</guid>
            <pubDate>Tue, 10 Nov 2020 15:39:51 GMT</pubDate>
            <description><![CDATA[<h2 id="1-props"><strong>1. Props</strong></h2>
<ul>
<li>props : properties(속성)</li>
<li>단어 뜻 그대로 <strong>컴포넌트의 속성값</strong>을 의미.</li>
<li>props는 <strong>부모 컴포넌트로부터 전달 받은 데이터를 지니고 있는 객체</strong></li>
<li>props값은 해당 컴포넌트를 불러와 사용하는 부모 컴포넌트에서 설정할 수 있다.</li>
<li>props를 통해 부모 컴포넌트로부터 자식 컴포넌트에게 state의 상태값, event handler를 넘겨줄 수 있다.</li>
</ul>
<h2 id="2-props-객체"><strong>2. Props 객체</strong></h2>
<ul>
<li>클래스형 컴포넌트에서 props, 즉 컴포넌트의 속성을 어떻게 정의할까?</li>
</ul>
<blockquote>
<pre><code class="language-jsx">// Parent.js
</code></pre>
</blockquote>
<p>import React from &#39;react&#39;;
import Child from &#39;../pages/Child/Child&#39;;</p>
<blockquote>
</blockquote>
<p>class Parent extends React.Component {
  constructor() {
    super();
    this.state = {
      color: &#39;red&#39;
    };
  }</p>
<blockquote>
</blockquote>
<p>  render() {
    return (
      <div>
        <h1>Parent Component</h1>
                <Child />
      </div>
    );
  }
}</p>
<blockquote>
</blockquote>
<p>export default State;</p>
<pre><code>
- `Parent.js` 부모 컴포넌트이다.(기본적으로  app.js가 부모 컴포넌트이다.)
- 부모 컴포넌트 안에서 `&lt;Child/&gt;` 컴포넌트를 import 후 `&lt;h1&gt;` 태그 아래에 위치해주었다.
- 부모의 state에 있는 데이터를 `&lt;Child /&gt;` 컴포넌트에게 props를 통해 넘겨보겠다.

&gt;```jsx
// Parent.js
&gt;
import React from &#39;react&#39;;
import Child from &#39;../pages/Children/Children&#39;;
&gt;
class Parent extends React.Component {
  constructor() {
    super();
    this.state = {
      color: &#39;red&#39;
    };
  }
&gt;
  render() {
    return (
      &lt;div&gt;
        &lt;h1&gt;Parent Component&lt;/h1&gt;
                &lt;Child titleColor={this.state.color}/&gt;
      &lt;/div&gt;
    );
  }
}
&gt;
export default State;</code></pre><ul>
<li>자식 컴포넌트의 props 로 <code>titleColor</code> 속성을 생성했다.</li>
<li><code>titleColor</code>의 값으로 <code>this.state.color</code>, 즉 부모 컴포넌트의 state 객체 중 <code>color</code> 값을 전달해주었다.</li>
<li>이러한 방식으로 props를 통해 부모 컴포넌트 내부의 state 값을 자식 컴포넌트에게 전달할 수 있다.</li>
<li>그렇다면 <code>&lt;Child /&gt;</code> 컴포넌트 내부에서 전달 받은 props 데이터를 어떻게 사용하는지 확인해보자.</li>
</ul>
<h3 id="props-객체">props 객체</h3>
<ul>
<li><strong>state 와 마찬가지로 컴포넌트의 props는 객체이다.</strong></li>
<li>자식 컴포넌트인 <code>Child.js</code> 내부에서 props 객체는 어떻게 구성되어 있울까?</li>
</ul>
<blockquote>
<pre><code class="language-jsx">// Child.js
</code></pre>
</blockquote>
<p>import React from &#39;react&#39;;</p>
<blockquote>
</blockquote>
<p>class Child extends React.Component {
  render() {
        // console.log(this.props);</p>
<blockquote>
</blockquote>
<pre><code>return (
  &lt;div&gt;
    &lt;h1 style={{color : this.props.titleColor}}&gt;Child Component&lt;/h1&gt;
  &lt;/div&gt;
);</code></pre><p>  }
}</p>
<blockquote>
</blockquote>
<p>export default State;</p>
<ul>
<li><code>&lt;Child /&gt;</code> 컴포넌트 내부에 <code>&lt;h1&gt;</code> 태그가 있고 해당 태그의 글자 색상을 부모 컴포넌트의 state 로부터 전달 받은 데이터를 지정해주도록 한다.</li>
<li><code>render</code> 함수와 <code>return</code> 함수 사이에서 <code>this.props</code> 값을 <code>console.log</code>로 확인!</li>
<li>결과 확인 시 props 객체 안에 부모로 부터 전달받은 데이터가 key-value 형태로 담겨 있는 것을 확인할 수 있다. </li>
</ul>
<blockquote>
<pre><code class="language-jsx"></code></pre>
</blockquote>
<h1 style={{color : this.props.titleColor}}>Child Component</h1>
>
// this : 해당 컴포넌트
// this.props : 해당 컴포넌트의 props 객체
// this.props.titleColor : props 객체의 특정 key(titleColor)값. 즉 "red"
```

<ul>
<li>컴포넌트 내부에서 부모 컴포넌트로부터 전달받은 props 데이터를 사용하기 위해서는 state 객체에 접근하는 것과 마찬가지로 props 객체의 특정 키값, 즉 <code>this.props.titleColor</code> 이렇게 작성하면 된다!</li>
</ul>
<h2 id="3-props--event">3. Props &amp; event</h2>
<h3 id="props를-통한-event-handler-전달">props를 통한 event handler 전달</h3>
<blockquote>
<pre><code class="language-jsx">// Parent.js
</code></pre>
</blockquote>
<p>import React from &#39;react&#39;;
import Child from &#39;../pages/Children/Children&#39;;</p>
<blockquote>
</blockquote>
<p>class Parent extends React.Component {
  constructor() {
    super();
    this.state = {
      color: &#39;red&#39;
    };
  }</p>
<blockquote>
</blockquote>
<p>  handleColor = () =&gt; {
    this.setState({
      color: &#39;blue&#39;
    })
  }</p>
<blockquote>
</blockquote>
<p>  render() {
    return (
      <div>
        <h1>Parent Component</h1>
                <Child titleColor={this.state.color} changeColor={this.handleColor}/>
      </div>
    );
  }
}
export default State;</p>
<pre><code>
- props 객체를 통해 state 데이터 뿐만 아니라 부모에서 정의한 event handler 함수도 넘겨줄 수 있다.
- props의 `changeColor` 값으로 Parent 함수에서 정의한 `handleColor` 함수 자체를 넘겨주고 있다.
- `&lt;Child /&gt;` 컴포넌트에서 어떻게 props로 전달받은 `handleColor` 함수를 활용하는지 살펴보자.

&gt;```jsx
// Child.js
&gt;
import React from &#39;react&#39;;
&gt;
class Child extends React.Component {
  render() {
        // console.log(this.props);
&gt;
    return (
      &lt;div&gt;
        &lt;h1 style={{color : this.props.titleColor}}&gt;Child Component&lt;/h1&gt;
                &lt;button onClick={this.props.changeColor}&gt;Click&lt;/button&gt;
      &lt;/div&gt;
    );
  }
}
&gt;
export default State;</code></pre><ul>
<li><code>&lt;Child /&gt;</code> 컴포넌트 내부에 <code>&lt;button&gt;</code> 태그가 있다.</li>
<li>다음의 순서에 따라서 코드가 실행된다.<ul>
<li><code>&lt;button&gt;</code> 요소에서 <code>onClick</code> 이벤트 발생</li>
<li>이벤트 발생 시 <code>this.props.changeColor</code> 실행</li>
<li>props 객체의 <code>changeColor</code>, 즉 부모 컴포넌트로부터 전달받은 <code>handleColor</code> 함수 실행</li>
<li><code>handleColor</code> 함수 실행 시 <code>setState</code> 함수 호출 - state의 <code>color</code> 값을 <code>&#39;blue&#39;</code> 로 변경</li>
<li><code>render</code> 함수 호출</li>
<li><code>&lt;Child /&gt;</code> 컴포넌트에 변경된 state 데이터(<code>this.state.color</code>) 전달</li>
<li><code>this.props.titleColor</code> 를 글자 색상으로 지정하는 <code>&lt;h1&gt;</code> 타이틀 색상 변경</li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>