<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>teo_ryu.log</title>
        <link>https://velog.io/</link>
        <description>개발하는 디자이너 그리고 실험가</description>
        <lastBuildDate>Sun, 03 Jul 2022 12:19:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>teo_ryu.log</title>
            <url>https://velog.velcdn.com/images/teo_ryu/profile/8724239e-0c2a-4ac6-9935-28d76784a0df/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. teo_ryu.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/teo_ryu" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[React] ESlint, prettier, husky, CRA]]></title>
            <link>https://velog.io/@teo_ryu/ESlintprettierhuskyCRA</link>
            <guid>https://velog.io/@teo_ryu/ESlintprettierhuskyCRA</guid>
            <pubDate>Sun, 03 Jul 2022 12:19:09 GMT</pubDate>
            <description><![CDATA[<h1 id="강의">강의</h1>
<blockquote>
<p>한 번에 끝내는 프론트엔드 개발 초격차 패키지 Online.</p>
<blockquote>
<p>Ch 3. Creating React Project</p>
</blockquote>
</blockquote>
<h1 id="내용">내용</h1>
<h3 id="결론">결론</h3>
<p>다른 거 다 필요 없고 <strong>CRA로 했을 때, husky로 Git Hooks을 공유(통일)하자</strong></p>
<h3 id="왜">왜?</h3>
<ul>
<li>프로젝트에서 팀원들 간의 스타일을 통일하기 위해서</li>
<li>프로젝트를 관리하기 위해서 (test 등)</li>
</ul>
<hr>
<h2 id="1-git-hooks">1. git hooks</h2>
<ul>
<li>git 커밋, 머지, 푸시 등을 할 때 자동으로 특정 스크립트를 실행하게 할 수 있다.</li>
<li>특정 상황에 특정 스크립트를 실행하게 하는 것</li>
</ul>
<hr>
<h2 id="2-cra">2. CRA</h2>
<ul>
<li>Create-react-app의 줄임말</li>
<li>페이스북의 공식 오픈소스로 아주 쉽게 리액트 프로젝트를 생성하는 방법</li>
<li>최신 버전으로, 기초적인 세팅이 다 되어있음
참고 : <a href="https://create-react-app.dev/">https://create-react-app.dev/</a></li>
</ul>
<h3 id="사용법">사용법</h3>
<p>npx create-react-app</p>
<h3 id="packagejson">package.json</h3>
<p>package.json 파일은 현재 프로젝트에 관한 정보와 버전의 내용이 들어있는 파일
<img src="https://velog.velcdn.com/images/teo_ryu/post/61b4ee43-6e72-460c-b76c-cc2ec76e4a0d/image.png" alt="">
dependencies
각 라이브러리들</p>
<ul>
<li>web-vitals : 구글에서 사이트 개선을 위해 측정하기 위한 정보</li>
</ul>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/be053bcf-a41a-4972-a58a-b088856de5b1/image.png" alt="">
scripts
**    npm start **
    : 개발모드 화면, 수정하면 반영</p>
<p>**    npm run build** 
    : 배포, 최적화
    : build 폴더에 파일이 담기게 됨
    -&gt; npm install <strong>-g</strong> serve : 압축된 상태로 빌드파일 실행
    -&gt; npx serve <strong>-s</strong> build : 템퍼러리하게 실행</p>
<blockquote>
<p><strong>-g</strong> 옵션 : Global의 약자 - 어떤 디렉터리 에서든지 해당 모듈을 사용한다는 옵션
 <strong>-s</strong> 옵션 : singlePage의 약자 - 어떤 라우팅으로 하더라도 index로 옮기게하는 옵션</p>
</blockquote>
<p>**    npm test **
    : jest기반으로 테스트 코드 작성가능
    : 아래의 테스트 파일들을 실행시킴</p>
<ul>
<li>.test.js ~로 끝나는 파일</li>
<li>.spec.js ~로 끝나는 파일</li>
<li><em>tests</em> 폴더 안의 파일</li>
</ul>
<p>**    npm run eject **
    : create-react-app의 관리를 받지 않겠다! 라는 것임
    하게되면 react-scripts가 담고 있던 각종 패키지가 다 드러나고 react-scripts는 사라짐
    현업에서 잘하지 않음. 오픈소스로 잘 관리되고 있던 것을 탈출하는 것이어서</p>
<hr>
<h2 id="3-eslint">3. ESLint</h2>
<h4 id="1-설치-방법">1) 설치 방법</h4>
<p><span style="color:var(--destructive1)">*CRA하면 따로 생성할 필요가 없음.</span>
<code>mkdir (프로젝트 이름)</code>
<code>cd (프로젝트 이름)</code>
<code>npm init -y</code></p>
<blockquote>
</blockquote>
<pre><code>-y는 yes의 약자 - default값으로 설정된 package.json을 만든다. 여러가지를 묻지 않음.</code></pre><p><code>npm i eslint -D</code></p>
<blockquote>
<p>   i : install
    -D 옵션 : dev디펜던시, 빌드 안에 들어갈 필요가 없다면 (= run time에 사용되는 패키지가 아니라면) -D 옵션을 건다.
    디펜던시
    옵션을 걸면 아래의 부분 devDependencies에 들어간다.
<img src="https://velog.velcdn.com/images/teo_ryu/post/e2c0bf51-8b1d-43a4-939d-31a0d33f7fab/image.png" alt=""></p>
</blockquote>
<p><code>npx eslint –init</code></p>
<ul>
<li>초기화 하면서 설정을 물어봄. (체크, 문제찾기, 강제성)<h4 id="2-사용-방법">2) 사용 방법</h4>
<code>npx eslint (검사할파일명)</code> : 문제가 무엇인지 확인해줌
<code>npx eslint (검사할파일명) –fix</code> : 수정하기</li>
</ul>
<h4 id="3-설정-방법">3) 설정 방법</h4>
<p>아래와 같이 package.json &gt; eslintConfig &gt; &quot;rules&quot;를 추가하여서 항목 추가</p>
<blockquote>
<p>rules : <a href="https://eslint.org/docs/latest/rules/">https://eslint.org/docs/latest/rules/</a>
Configuring Rules : <a href="https://eslint.org/docs/latest/user-guide/configuring/rules">https://eslint.org/docs/latest/user-guide/configuring/rules</a>
<img src="https://velog.velcdn.com/images/teo_ryu/post/c5469780-d9f0-433a-84a2-e0d38791bd16/image.png" alt=""></p>
</blockquote>
<h4 id="4-extension">4) extension</h4>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/eb819f11-bb09-47f9-81df-2947c76be4b1/image.png" alt=""></p>
<h2 id="4-prettier">4. Prettier</h2>
<h4 id="1-설치-방법-1">1) 설치 방법</h4>
<p><code>mkdir (프로젝트 이름)</code>
<code>cd (프로젝트 이름)</code>
<code>npm init -y</code>
<code>npm i prettier -D</code></p>
<h4 id="2-사용-방법-1">2) 사용 방법</h4>
<p><code>npx prettier (확인할 파일명)</code> : 확인할 경우
<code>npx prettier (확인할 파일명) –write</code> : 수정까지 할 경우</p>
<h4 id="3-설정-방법-1">3) 설정 방법</h4>
<p>.prettierrc.json 파일을 생성하고
<a href="https://prettier.io/docs/en/options.html">https://prettier.io/docs/en/options.html</a> 참고하여 옵션 입력</p>
<blockquote>
<p>예시<img src="https://velog.velcdn.com/images/teo_ryu/post/02e657e9-95b3-474a-b39f-07c9601e9504/image.png" alt=""></p>
</blockquote>
<h4 id="3-extension">3) extension</h4>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/ce8d58a9-982d-4ba9-992a-b3697a1c6e70/image.png" alt=""></p>
<h2 id="5-husky">5. Husky</h2>
<h2 id="6-lint-staged">6. lint-staged</h2>
<h2 id="56-husky--lint-staged">5+6. Husky &amp; lint-staged</h2>
<p>Husky : 깃훅을 쉽게 사용하게 하는 라이브러리
lint-staged : git에 staged된 파일만 lint해주는 라이브러리</p>
<h4 id="1-설치-방법-2">1) 설치 방법</h4>
<p><span style="color:var(--destructive1)">*CRA로 생성된 프로젝트 기준</span></p>
<ol>
<li><code>npm i husky -D</code></li>
<li><code>npx husky install</code></li>
<li>파일 수정 
package.json &gt; “scripts” : {<code>“prepare”: “husky install”</code> …}</li>
<li><code>npx husky add .husky/pre-commit “npx lint-staged”</code> .husky폴더의 pre-commit 파일에 보면 npx lint-staged 라는 코드가 삽입된다.</li>
</ol>
<blockquote>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/08ef04a5-f78e-479f-854d-ff4aa6120759/image.png" alt=""></p>
</blockquote>
<ol start="5">
<li><code>npm i lint-staged -D</code> lint-staged 설치</li>
<li>작동 시킬 파일 범위 정하기 - package.json 에 아래의 코드 추가<pre><code>&quot;lint-staged&quot;: {
 “**/*.js” : [
     &quot;eslint –fix&quot;,
     &quot;prettier –write&quot;,
     &quot;git add&quot;
 ]
},</code></pre></li>
</ol>
<blockquote>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/bb6578c2-148c-4c71-9ed9-0d2d4c8a7f7a/image.png" alt=""></p>
</blockquote>
<ol start="7">
<li><code>npm i prettier -D</code> : prettier 설치</li>
<li>VScode : Preferences &gt; Settings &gt; Editor : format on Save [ ]해제</li>
</ol>
<h1 id="소감">소감</h1>
<p><del>하.. 별거 아닌 내용인데.. 
최선의 방법이 아닌 원리부터 설명해주다보니.. 답답했다.</del>
ESlint 남이 세팅해준 것만 썼지 세팅법은 처음 제대로 배웠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] To do list 만들기 ]]></title>
            <link>https://velog.io/@teo_ryu/React-To-do-list-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@teo_ryu/React-To-do-list-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Sun, 19 Jun 2022 08:27:28 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/teo_ryu/post/e3993a45-87c1-4f9c-b4c6-bacaee99e076/image.gif" alt=""></p>
<h1 id="강의">강의</h1>
<blockquote>
<p>벨로퍼트와 함께하는 모던 리액트</p>
<blockquote>
<p>3장. 투두리스트 만들기
<a href="https://react.vlpt.us/mashup-todolist/">https://react.vlpt.us/mashup-todolist/</a></p>
</blockquote>
</blockquote>
<h2 id="1-세팅">1. 세팅</h2>
<p>yarn add styled-components
yarn add react-icons</p>
<h2 id="2-참고-사이트">2. 참고 사이트</h2>
<p>오픈컬러
<a href="https://yeun.github.io/open-color/">https://yeun.github.io/open-color/</a></p>
<p>아이콘
<a href="https://react-icons.github.io/react-icons/">https://react-icons.github.io/react-icons/</a></p>
<h2 id="3-styled-components">3. styled-components</h2>
<p>셀렉터 : 다른 css 요소에 스타일 변경하기 </p>
<blockquote>
<pre><code class="language-js">const Remove = styled.div`
 opacity: 0;
`;
ㅤ
const TodoItemBlock = styled.div`
&amp;:hover {
   ${Remove} {
       opacity: 1;
   }
}`;</code></pre>
</blockquote>
<pre><code>
## 4. useState
&gt;```js function TodoCreate() {
 const [open, setOpen] = useState(false); // useState 안에는 기본값
 const onToggle = () =&gt; setOpen(!open);
ㅤ
 return (
   &lt;CircleButton open={open} onClick={onToggle}&gt;
     &lt;MdAdd /&gt;
   &lt;/CircleButton&gt;
 );
}</code></pre><h2 id="5-커스텀-훅">5. 커스텀 훅</h2>
<p>반복을 줄이고 재사용성을 높이기</p>
<blockquote>
<pre><code class="language-js">export function useTodoState() {
  const context = useContext(TodoStateContext);
  if (!context) {
    throw new Error(&quot;Cannot find TodoProvider&quot;);
  }
  return context;
}</code></pre>
</blockquote>
<p>```</p>
<h2 id="6-context">6. context</h2>
<p>React의 전역적이라고 볼 수 있는 데이터 관리 방법
<code>import React, { createContext, useContext } from &quot;react&quot;;</code>
<code>const state = useContext(TodoStateContext);</code></p>
<h2 id="7-구조를-이해하기">7. 구조를 이해하기</h2>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/5361c916-c97a-4f08-b868-897f6760c835/image.png" alt=""></p>
<p>외부에 TodoContext</p>
<h1 id="소감">소감</h1>
<h3 id="1-subtask만들기--span-stylecolorvar--destructive1실패span">1. subtask만들기 : <span style="color:var(--destructive1)">실패</span></h3>
<p>기존 강의가 끝나고나서 subtask를 만들어서 추가하고 삭제하게 만들려고 했는데 실패했다. UI만 만들었지, 리액트 데이터 연동을 하지못했다. 제대로 이해하지 못한 것 같고.. 좀 더 시도해볼 수도 있겠지만, 지금 부딪히는 것보다 다른 예제들을 더 접하는 것이 좋겠다. </p>
<ul>
<li>map을 두 번 돌리는 게 문제가 있었나.</li>
<li>하위 구조를 만들어서 연동시키는 것<h3 id="2-styled-components--span-stylecolorvar--primary1아하span">2. styled-components : <span style="color:var(--primary1)">아하</span></h3>
styled-components가 되게 와닿지 않았었는데 실습으로 접하니 어느 정도 이해가 되고 익숙해졌다.</li>
</ul>
<p><em>조급하지 말자</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[javascript] 객체 생성자, prototype, class]]></title>
            <link>https://velog.io/@teo_ryu/javascript-prototype-class</link>
            <guid>https://velog.io/@teo_ryu/javascript-prototype-class</guid>
            <pubDate>Sat, 18 Jun 2022 00:52:06 GMT</pubDate>
            <description><![CDATA[<h1 id="강의">강의</h1>
<blockquote>
<p>벨로퍼트와 함께하는 모던 자바스크립트</p>
<blockquote>
<p>1장. 자바스크립트 입문
<a href="https://learnjs.vlpt.us/basics/">https://learnjs.vlpt.us/basics/</a></p>
</blockquote>
</blockquote>
<hr>
<h2 id="1-객체">1. 객체</h2>
<p>아래와 같이 <strong>객체 Object</strong>를 만들 수 있다.
객체 안에 들어가는 것은 <strong>속성 Property</strong>과 <strong>메서드 method</strong>
<strong>속성 Property</strong>는 키 key : 값 value로 구성
object = { key : value }</p>
<h3 id="1-constructor-생성자-방식">1) constructor 생성자 방식</h3>
<blockquote>
<pre><code class="language-js">const pig = new Object();
pig.type = &quot;돼지&quot;;
pig.name = &quot;꿀꿀이&quot;;
pig.sound = &quot;꿀꿀&quot;;</code></pre>
</blockquote>
<pre><code>
### 2) literal 리터럴 방식 👏
&gt;```js
const pig = {
  type: &quot;돼지&quot;,
  name: &quot;꿀꿀이&quot;,
  sound: &quot;꿀꿀&quot;
};</code></pre><hr>
<h2 id="2-객체-생성자">2. 객체 생성자</h2>
<p>객체 생성자란 객체를 반복적으로 만들 수 있는 틀을 의미한다.</p>
<ul>
<li>Constructor 생성자 -&gt; instance 만들어진 객체</li>
</ul>
<h3 id="1-function-방식">1) function 방식</h3>
<blockquote>
<pre><code class="language-js">function Animal(type, name, sound) {
   this.type = type;
   this.name = name;
   this.sound = sound;
}
const pig = new Animal(&quot;돼지&quot;, &quot;꿀꿀이&quot;, &quot;꿀꿀);
const dog = new Animal(&quot;개&quot;, &quot;멍멍이&quot;, &quot;멍멍&quot;);
const cat = new Animal(&quot;고양이&quot;, &quot;야옹이&quot;, &quot;야옹&quot;);</code></pre>
</blockquote>
<pre><code>
### 2) class 방식 👏
- 필드 field
- 메서드 method

&gt;```js
class Animal {
    constructor(type, name, sound) {
      this.type = type;
      this.name = name;
      this.sound = sound;
    }
}
const pig = new Animal(&quot;돼지&quot;, &quot;꿀꿀이&quot;, &quot;꿀꿀);
const dog = new Animal(&quot;개&quot;, &quot;멍멍이&quot;, &quot;멍멍&quot;);
const cat = new Animal(&quot;고양이&quot;, &quot;야옹이&quot;, &quot;야옹&quot;);</code></pre><h2 id="3-prototype">3. prototype</h2>
<h3 id="function방식과-class방식의-차이">function방식과 class방식의 차이</h3>
<blockquote>
<pre><code class="language-js">function AnimalFunc(type, name, sound) {
  this.type = type;
  this.name = name;
  this.sound = sound;
  this.say = function () {
    console.log(this.sound);
  };
}
 ㅤ
AnimalFunc.prototype.code = function () {
  console.log(this.sound);
};
ㅤ
class AnimalClass {
  constructor(type, namename, sound) {
    this.type = type;
    this.namename = namename;
    this.sound = sound;
  }
  say() {
    console.log(this.sound);
  }
}
ㅤ
AnimalClass.prototype.code = function () {
  console.log(this.sound);
};</code></pre>
</blockquote>
<pre><code>
## 4. constructor
생성된 객체의 생성자 찾기
&gt;```js
function Animal(type, name, sound) {
  this.type = type;
  this.name = name;
  this.sound = sound;
}
ㅤ
const pig = new Animal(&quot;돼지&quot;, &quot;꿀꿀이&quot;, &quot;꿀꿀&quot;);
ㅤ
console.log(pig.constructor.name); // Animal
console.log(Animal.constructor.name); // Function
```


## 5. static method
static 키워드를 사용하면 객체가 아니라 클래스에 속하게 만들 수 있다. 
객체 차원이 아니라 클래스 차원에서 함수를 구현해야 하는 경우 필요하다.
**static 키워드로 만든 함수는 반대로 만들어진 인스턴스에서 불러올 수 없다.**
&gt;```js
class Pet {
  constructor(..., sound) {
    ...
    this.sound = sound;
  }
  static say() {
    console.log(&quot;say &quot; + this.sound);
  }
  speak() {
    console.log(&quot;speak &quot; + this.sound);
  }
}
ㅤ
const turtle = new Pet(&quot;엉금&quot;);
ㅤ
// 클래스 - static
console.log(Pet.say); // f say() {}
console.log(Pet.say()); // say undefined
// 클래스
console.log(Pet.speak); // undefined
console.log(Pet.speak()); // not a function
ㅤ
// 객체 - static
console.log(turtle.say); // undefined
console.log(turtle.say()); // not a function
// 객체
console.log(turtle.speak); // f speak() {}
console.log(turtle.speak()); // speak 엉금
```
```

## 6. call 함수
프로토타입을 받아올 때 사용, **첫 번째 인자에는 this를 받아온다.**
&gt;```js
function Animal(type, name, sound) {
 this.type = type;
 this.name = name;
 this.sound = sound;
}
 ㅤ
Animal.prototype.say = function () {
 console.log(this.sound);
};
 ㅤ
function Dog(name, sound) {
 Animal.call(this, &quot;개&quot;, name, sound); // Call 함수
}
```


## 7. extend &amp; super
super의 2가지 사용법
- 1. super(): 부모-class의 생성자constructor를 참조
- 2. super.method() : 부모-class의 prototype-method를 참조

&gt;```js
function Animal(type, name, sound) {
  this.type = type;
  this.name = name;
  this.sound = sound;
}
 ㅤ
Animal.prototype.makeNoise = function () {
  console.log(&quot;wooo&quot;);
};
 ㅤ
class Cat extends Animal { // extends
  constructor(name, sound) {
    super(&quot;고양이&quot;, name, sound); // super의 사용
  }
  meow() {
    super.makeNoise(); // super의 사용
  }
}

## 8. delete
delete 명령어로 프로퍼티를 지우거나 오브젝트를 지울 수 있다.
- delete 프로퍼티
- delete 오브젝트


## 9. Object.assign();
- 오브젝트 얕은 복사

## 10. 깊은 복사와 얕은 복사
이건 워낙 고생한 이슈기도 하고, 정말 필요한 부분이라 나중에 다시 더 진하게 보는 걸로...


&gt; * 참고 : https://bbangson.tistory.com/78
JSON으로 파싱해서 텍스트를 전부 그대로 붙여넣는 방법이 나와있다.
정말로 이렇게 하는 방법밖에 없는 것인가..
전에 무식하게 포문 다 돌려가면서 했던 것이 맞는 방법이었나보다..


</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[javascript]  __proto__ 그 끝은 어디에?]]></title>
            <link>https://velog.io/@teo_ryu/js-proto-end</link>
            <guid>https://velog.io/@teo_ryu/js-proto-end</guid>
            <pubDate>Sat, 18 Jun 2022 00:41:32 GMT</pubDate>
            <description><![CDATA[<h1 id="자바스크립트-상속">자바스크립트 상속</h1>
<p>자바스크립트 상속은 아는 개념이라 강의내용만 듣고 넘어가려다가 예전에 개발할 때 헷갈리는 부분이 있어서 잘 안쓰다보니 이번에는 대충 넘어가지 않고 집요하게 정리를 해보았다.</p>
<h2 id="1-상속">1. 상속</h2>
<h3 id="span-stylecolorvar--primary101-function방식과-class방식의-차이span"><span style="color:var(--primary1)">01. function방식과 class방식의 차이</span></h3>
<p>ES6 도입 이전에도 function을 통해서 생성자를 만들어 클래스처럼 사용하였으나, class가 나오면서 기능이 더 명확해졌다.</p>
<blockquote>
<pre><code class="language-js">function AnimalFunc(type, name, sound) {
  this.type = type;
  this.name = name;
  this.sound = sound;
  this.say = function () {
    console.log(this.sound);
  };
}
ㅤ
AnimalFunc.prototype.noise = function () {
  console.log(this.sound);
};
ㅤ
// -----------------------------------------
class AnimalClass {
  constructor(type, namename, sound) {
    this.type = type;
    this.namename = namename;
    this.sound = sound;
  }
  say() {
    console.log(this.sound);
  }
}
ㅤ
AnimalClass.prototype.noise = function () {
  console.log(this.sound);
};</code></pre>
</blockquote>
<pre><code>같은 생성자를 Function방식과 Class방식으로 짜보았다.
&gt;```js
console.log(AnimalFunc.prototype); // {noise: f()}
console.log(AnimalFunc.prototype.say); // undefined
console.log(AnimalFunc.prototype.noise); // f() {}
ㅤ
console.log(AnimalClass.prototype); // {noise: f()}
console.log(AnimalClass.prototype.say); // f say() {} //?????
console.log(AnimalClass.prototype.noise); // f() {}</code></pre><p>*<em>의문 1. *</em>
여기서 의문인 점은 클래스로 짠 say 함수의 경우 직접 콘솔에 입력하면 나오지만 prototype으로 찍으면 안나오는가?
<span style="color:var(--destructive1)">...결국 답을 찾지 못했다.</span></p>
<hr>
<blockquote>
<pre><code class="language-js">function Animal(type, name, sound) {
  this.type = type;
  this.name = name;
  this.sound = sound;
}
ㅤ
Animal.prototype.say = function () {
  console.log(&quot;say&quot;, this.sound);
};
ㅤ
// 개로 상속 --------------------------------
function Dog(name, sound) {
  Animal.call(this, &quot;개&quot;, name, sound); // call 함수
}
ㅤ
Dog.prototype = Animal.prototype;
ㅤ
Dog.prototype.speak = function () {
  console.log(&quot;speak&quot;, this.sound);
};
ㅤ
// 고양이로 상속 --------------------------------
class Cat extends Animal {
  constructor(name, sound) {
    super(&quot;고양이&quot;, name, sound); // super 함수
  }
}
ㅤ
Cat.prototype.speak = function () {
  console.log(&quot;speak&quot;, this.sound);
};
ㅤ
// 객체 생성 --------------------------------
const mong = new Dog(&quot;몽이&quot;, &quot;왈왈&quot;);
const mio = new Cat(&quot;미오&quot;, &quot;냥냥&quot;);</code></pre>
</blockquote>
<pre><code>

---
**의문 2. **
완전 다른 방식인데 왜 같은 것처럼 설명되어 있을까?

![](https://velog.velcdn.com/images/teo_ryu/post/d6adee18-a2f3-4af8-a48b-ee7a913bc802/image.png)
`Dog.prototype = Animal.prototype;`을 하게 되면 말 그대로 `Animal.prototype`을 함께 쓰게 되기 때문에 다른 동물들도 같은 방식으로 연결하게 되면 Dog에 업데이트하든 Pig를 업데이트하든 `Animal.prototype`안에 다 들어가게 된다. 상속이 아니라 프로토타입 공유에 가까운.. 

반면 오른쪽처럼 class로 상속받은 Cat의 경우 `Animal.prototype`만 상속받으면서 추가되는 메서드는 자신에게만 추가한다. 

---
### &lt;span style=&quot;color:var(--primary1)&quot;&gt;02. prototype과 \_\_proto\_\_&lt;/span&gt;

세 가지 키워드를 통해서 상속받는 관계를 추적하고 접근할 수 있게 된다.
- 1. **prototype** : 해당 클래스의 prototype에 접근
- 2. **\_\_proto\_\_** : 상속받은 곳으로 참조
- 3. **constructor** : 해당 인스턴스를 만든 생성자를 참조


&gt;```js
console.log(Animal.prototype); // {say: ƒ (), speak: ƒ ()}
console.log(Dog.__proto__); // ƒ ()
console.log(Cat.__proto__); // ƒ Animal() {}
ㅤ
//------------------------------------
console.log(Dog.prototype); // {say: ƒ (), speak: ƒ ()}
console.log(mong.__proto__); // {say: ƒ (), speak: ƒ ()}
ㅤ
console.log(Cat.prototype); // Animal {speak: ƒ (), say: ƒ (), constructor: Object}
console.log(mio.__proto__); // Animal {speak: ƒ (), say: ƒ (), constructor: Object}
ㅤ
//------------------------------------
console.log(mong.__proto__.__proto__ === Animal.prototype); // false
console.log(mio.__proto__.__proto__ === Animal.prototype); // true</code></pre><p>이것을 보면 function 방식으로 선언한 Dog의 경우 기능적으로만 상속처럼 보일 뿐 실제로 구조적으로 연결되는 것은 아니다. <code>Dog.__proto__</code> 는 빈 함수를 가리키고 있는 반면, <code>Cat.__proto__</code> 는 Animal()을 정확하게 가리키고 있다.</p>
<p>여기서 하나 의문이었던 것이 
<code>mio.__proto__.__proto__</code> 와 <code>Cat.__proto__</code> 가 콘솔에서 같지 않게 나왔다는 것이었다. <strong>__proto__</strong>는 거슬러 올라가는 것이 아닌가...? <span style="color:var(--destructive1)"><del>사실 이 때 살짝 포기했다</del></span></p>
<p>|-|-|-|의미|
|---|---|---|---|---|
|⬇️ <code>constructor</code>||||
|<code>mio.constructor</code>|===|<code>Cat</code>|같다|
|<code>Cat.constructor</code>|===|<code>Animal.constructor</code>|같다|?
|||||
|⬇️ 여기까지는 괜찮다.||||
|<code>mio.__proto__</code>|===|<code>Cat.prototype</code>|true|
|<code>mio.__proto__.__proto__</code>|===|<code>Animal.prototype</code>|true|
|||||
|⬇️ ....? ||||
|<code>mio.__proto__.__proto__</code> |!==|<code>Cat.__proto__</code>|같지 않다|???|
|<code>Cat.__proto__</code> |!==|<code>Animal.prototype</code>|같지 않다|???|
|||||
|⬇️ ....||||
|<code>Cat.prototype.__proto__</code> |===|<code>Animal.prototype</code>|true|</p>
<p>무슨 끈기가 생겼는지.. 고생끝에 드디어 이해했다.
콘솔로 하나하나 확인해보다가 겨우 깨닫게 되었다.
<del><code>__proto__</code>는 &quot;인스턴스&quot;에서 거슬러올라 갈 때만 해당되는 것</del>
아니 그림으로 그려서 확인하는 것이 더 좋겠다.</p>
<p><strong>prototype</strong>과 <strong>__proto__</strong>는 서로 반대되는 개념도 아니고, 일직선의 구조가 아니기 때문에 의도한대로 되지 않았던 것이다.</p>
<p>핵심은 여기에 있다.
세 가지 키워드의 관계를 그림으로 나타냈다.</p>
<p>인스턴스를 기준으로 자신을 찍어낸 클래스를 찾으려면 <strong>.constructor</strong>를, 내가 상속하고 있는 prototype을 찾기 위해서는 <strong>.__proto__</strong>를, 클래스의 prototype을 참조하려면 <strong>.prototype</strong>을 사용하면 된다.
<img src="https://velog.velcdn.com/images/teo_ryu/post/60d01a63-a625-474d-a535-81fc97decf67/image.png" alt=""></p>
<p>이왕 콘솔로 노가다하면서 찾아보는 거 그 끝은 어디에 있을까 올라가다가 Object와 Function까지 만나게 되었다. Object와 Function은 순환하는 구조로 서로 맞물려 있었고 Object.prototype의 __proto__는 null로 끝난다. Function.<strong>prototype</strong>과 Function.<strong>__proto__</strong>가 같다고 나올 때는 너무 기분이 이상했다.. <del>무사수행으로 무신 만난 느낌</del></p>
<p>어찌보면 쓸데없는 내용을 디깅한 것 같기도한데 큰 구조를 이해하는데 좀 도움이 된 것 같다.
<img src="https://velog.velcdn.com/images/teo_ryu/post/d1f6a052-bf78-43d9-9a14-768aca0cb537/image.png" alt=""></p>
<p>구글링으로 찾아본 다이어그램 이미지가 다양했는데 꼬여있는 그림들은 오히려 더 이해하기 힘들어서 직접 그려보게 되었다. <img src="https://velog.velcdn.com/images/teo_ryu/post/95efedc0-0b01-491f-82a4-7e275866711b/image.png" alt=""></p>
<h1 id="소감">소감</h1>
<p>직접 그리기까지 했으니 절대 안까먹을 것 같다.
저처럼 이렇게 사소한 것에서 잠시 고통받는 사람이 있다면 도움이 되기를 바라며..</p>
<blockquote>
<p>참고했던 곳중에 가장 잘 설명해둔 곳
같은 동물 예시라서 그런지 이해하기 쉬웠다.
*참고 : <a href="https://ko.javascript.info/class-inheritance">https://ko.javascript.info/class-inheritance</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[javascript] reduce 함수와 싸우기]]></title>
            <link>https://velog.io/@teo_ryu/javascript-reduce-%ED%95%A8%EC%88%98%EC%99%80-%EC%8B%B8%EC%9A%B0%EA%B8%B0</link>
            <guid>https://velog.io/@teo_ryu/javascript-reduce-%ED%95%A8%EC%88%98%EC%99%80-%EC%8B%B8%EC%9A%B0%EA%B8%B0</guid>
            <pubDate>Thu, 16 Jun 2022 21:12:03 GMT</pubDate>
            <description><![CDATA[<h1 id="span-stylecolorvar--destructive1-reduce-span"><span style="color:var(--destructive1);"> reduce </span></h1>
<pre><code>    필요없어서 안쓴거야! 했다가 들어가보니 최종 보스 같이 느껴졌던 리듀스.. 하지만 이해하고 보니 쉬웠다. 진작 뜯어볼 걸</code></pre><ul>
<li>함수를 실행하고 <strong>하나의 결과값</strong>을 반환</li>
<li>reduce는 줄이다라는 뜻이며, 누산기라고 이해하면 될 것 같다.</li>
</ul>
<hr>
<h3 id="1-우선-가장-단순화된-형태를-보자">1. 우선 가장 단순화된 형태를 보자</h3>
<ul>
<li>두 개의 인자를 갖는다. <ul>
<li><code>acc</code> accumulator : 누산기, 누적되는 값, 최종적으로 출력되는 값</li>
<li><code>cur</code> current : 현재 돌고 있는 요소</li>
</ul>
</li>
</ul>
<blockquote>
<pre><code class="language-js">const numbers = [4, 3, 2, 1];
let sum = numbers.reduce((acc, cur) =&gt; acc + cur)</code></pre>
</blockquote>
<pre><code>
위를 풀어서보면 아래와 같다.

&gt;```js
const numbers = [4, 3, 2, 1];
let sum = numbers.reduce((acc, cur) =&gt; {
    return acc + cur;
});</code></pre><p>더 풀어서보면 다음과 같다.
<code>acc</code> 에는 가장 첫 번째 원소인 &#39;4&#39;를 할당하고 (index 0)
<code>cur</code> 에는 나머지 원소인 &#39;3, 2, 1&#39;이 순차적으로 들어간다. (index 1, 2 ...)</p>
<blockquote>
<pre><code class="language-js">acc += cur; // 4 += 3;
acc += cur; // 7 += 2;
acc += cur; // 9 += 1;
console.log(acc); // 10</code></pre>
</blockquote>
<pre><code>
---

### 2. 옵션이 추가된 발전된 형태를 보자


- 2개의 인자 + 1개의 초기값
  - `acc` accumulator : 누산기, 누적되는 값, 최종적으로 출력되는 값
  - `cur` current : 현재 돌고 있는 요소
  - ** `initialValue` : acc의 초기값 _(optional) _**

&gt;```js
const numbers = [4, 3, 2, 1];
let sum = numbers.reduce((accumulator, current) =&gt; accumulator + current, 0);
console.log(sum);</code></pre><p><span style="color:var(--destructive1);margin-left:2em;"> 여기서 사람 화나게 하는 부분이 initialValue다.</span>
<span style="color:var(--destructive1);margin-left:2em;"> acc의 초기값으로 initialValue를 할당하는 순간 <strong>cur는 index 1부터가 아니라 0부터 돌아간다.</strong></span></p>
<p>같은 배열이지만 index 0의 주인이 달라진다.</p>
<blockquote>
<pre><code class="language-js">acc += cur; // 0 += 4;
acc += cur; // 4 += 3;
acc += cur; // 7 += 2;
acc += cur; // 9 += 1;
console.log(acc); // 10</code></pre>
</blockquote>
<pre><code>
---
### 3. 이제 두 개의 인자를 추가해보자

- 4개의 인자 + 1개의 초기값
  - `acc` accumulator : 누산기, 누적되는 값, 최종적으로 출력되는 값
  - `cur` current : 현재 돌고 있는 요소
  - `idx` index : 배열 요소의 순서 _(optional) _
  - `arr` array (또는 `src` source) : 현재 배열, 원본 배열 _(optional)_ 
  - `initialValue` : acc의 초기값 _(optional) _

다음은 평균을 구하는 reduce 함수이다.
마지막에만 나누기를 위해서 index와 arr를 불러왔다.
헷갈려보이지만 주석에 표시된 순서대로 돌면 된다.
&gt;```js
const avg = numbers.reduce((acc, cur, index, arr) =&gt; {
    if (index === arr.length - 1) { // index가 마지막일 때
        return (acc + cur) / arr.length; // cur - 4
    }
    return acc + cur; // cur - 1, 2, 3
    }, 0);
ㅤ
console.log(&quot;avg&quot;, avg);</code></pre><hr>
<h3 id="4-응용편">4. 응용편</h3>
<p>각 알파벳의 개수를 구하는 reduce 함수</p>
<blockquote>
<pre><code class="language-js">const alphabets = [&quot;a&quot;, &quot;a&quot;, &quot;c&quot;, &quot;c&quot;, &quot;c&quot;];
 ㅤ
const cnt = alphabets.reduce((acc, cur) =&gt; {
 if (acc[cur]) {
   acc[cur] += 1;
 } else {
   acc[cur] = 1; // acc.cur이 없으면 선언함
 }
 return acc;
}, {}); // acc는 오브젝트로 선언
 ㅤ
console.log(cnt); // {a: 2, c: 3}</code></pre>
</blockquote>
<pre><code>
- 1) 초기값으로 갑자기 **빈 오브젝트**를 할당하고
- 2) 오브젝트인데 배열처럼 불러오지 않나...
- 3) if 구문은 어떻게 되는 것인지..?

난리도 아니다.


우선 오브젝트의 프로퍼티(속성)를 불러오는 법을 알아야한다.
`obj[&quot;a&quot;]` 과 `obj.a` 은 동일하다.
&gt;```js
// 오브젝트의 프로퍼티를 부르는 2가지 방법
const obj = { a: &quot;hey&quot;, b: 0, c: 0 };
console.log(obj[&quot;a&quot;]); // &#39;hey&quot;
console.log(obj.a); // &quot;hey&quot;</code></pre><p>if 구문 <code>if (acc[cur])</code>을 이해하려면 오브젝트의 프로퍼티 선언방법을 봐야한다.
<code>acc[cur]</code> 이 <code>undefined</code> 인지 아닌지가 중요하다.
처음에는 당연히 빈 오브젝트가 초기값이다보니 <code>undefined</code> 가 된다.
그러면 else 구문에서 처음으로 프로퍼티가 선언되는 것이다.</p>
<blockquote>
<pre><code class="language-js">//  프로퍼티 없을 경우
console.log(obj.j); // undefined
console.log(obj[&quot;k&quot;]); // undefined
 ㅤ
//  프로퍼티 선언
obj.j = 1; // 선언
console.log(obj.j); // 1
 ㅤ
obj[&quot;k&quot;] = 2; // 선언
console.log(obj[&quot;k&quot;]); // 2</code></pre>
</blockquote>
<pre><code>
---

# 문제 풀이
배운 내용(배열 내장함수)을 바탕으로 3가지 방법으로 풀어보세요.
&gt;```js
function countBiggerThanTen(numbers) {
 /** 문제 **/
}
  ㅤ
const count = countBiggerThanTen([1, 2, 3, 5, 10, 20, 30, 40, 50, 60]);
console.log(count); // 5</code></pre><h3 id="1-첫-번째-풀이법">1) 첫 번째 풀이법</h3>
<p>reduce를 마지막으로 썼던 터라 이 생각 밖에 안났다.</p>
<blockquote>
<pre><code class="language-js">function countBiggerThanTen(numbers) {
 return numbers.reduce((acc, cur) =&gt; {
   if (cur &gt; 10) {
     return acc + 1;
   } else {
     return acc;
   }
 }, 0);
}</code></pre>
</blockquote>
<pre><code>
### 2) 두 번째 풀이법
딱히 더할 필요가 없다는 것을 깨닫고 필터로 잘라서 개수만 셌더니 코드가 한줄로 해결되었다.
&gt;```js
function countBiggerThanTen(numbers) {
 return numbers.filter((el) =&gt; el &gt; 10).length;
}</code></pre><h3 id="3-세-번째-풀이법">3) 세 번째 풀이법</h3>
<p>내가 기존에 항상 코딩하던 방식이다. 변수 범벅으로 ...</p>
<blockquote>
<pre><code class="language-js">function countBiggerThanTen(numbers) {
 let cnt = 0;
 numbers.forEach((element) =&gt; {
   if (element &gt; 10) cnt++;
 });
 return cnt;
}</code></pre>
</blockquote>
<p>```</p>
<h1 id="소감">소감</h1>
<p>고작 기초 자바스크립트를 풀고 있는 단계지만 전혀 부끄럽지 않고 기초를 다져놓는다는 안도감이 들었다. 항상 불안했었던 부분이 막 기능만들고 페이지만드는데 내 스스로 기초가 너무 부족했다는 점이었다. 마지막에 문제 3개 풀었는데 딱 정답도 저렇게 3가지여서 기분 좋았다. 하하
<del>근데 글 정리하는데 날 밤새웠다. 배우는데 1시간이면 글쓰는데는 3시간 걸리네..</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[javascript] 다시 완전 기초부터 - 02]]></title>
            <link>https://velog.io/@teo_ryu/javascript-%EB%8B%A4%EC%8B%9C-%EC%99%84%EC%A0%84-%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-02</link>
            <guid>https://velog.io/@teo_ryu/javascript-%EB%8B%A4%EC%8B%9C-%EC%99%84%EC%A0%84-%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-02</guid>
            <pubDate>Thu, 16 Jun 2022 21:06:55 GMT</pubDate>
            <description><![CDATA[<p>... 앞의 글에 이어서</p>
<h1 id="강의">강의</h1>
<blockquote>
<p>벨로퍼트와 함께하는 모던 자바스크립트</p>
<blockquote>
<p>1장. 자바스크립트 입문
<a href="https://learnjs.vlpt.us/basics/">https://learnjs.vlpt.us/basics/</a></p>
</blockquote>
</blockquote>
<h1 id="배열-내장-함수">배열 내장 함수</h1>
<h2 id="span-stylecolorvar--primary1margin-left2em-foreach-span"><span style="color:var(--primary1);margin-left:2em;"> forEach </span></h2>
<ul>
<li>배열의 요소 각각에 대해 실행</li>
</ul>
<blockquote>
<pre><code class="language-js">function zoo = [‘pig’, ‘cat’, ‘dog];</code></pre>
</blockquote>
<pre><code>1) 기본적으로 원리는 아래와 같이 함수를 선언해서 콜하는 방식
&gt;```js
function print(animal) {
    console.log(animal);
}
zoo.forEach(print);</code></pre><p>2) 보통 아래와 같이 함수를 안에서 선언쓰기 때문에 구조적으로 헷갈려 보인다.</p>
<blockquote>
<pre><code class="language-js">zoo.forEach(animal =&gt; {
    console.log(animal);
});</code></pre>
</blockquote>
<pre><code>
## &lt;span style=&quot;color:var(--primary1);margin-left:2em;&quot;&gt; map&lt;/span&gt;
- 배열의 요소 각각에 대하여 (함수를 호출하고 그 결과로) **새로운 배열을 반환**

&gt;```js
const numbers = [1, 2, 3];</code></pre><p>1) 마찬가지로 아래와 같이 선언한 함수를 콜</p>
<pre><code class="language-js">const square = n =&gt; n*n;
const squared = numbers.map(square);</code></pre>
<p>2) 보통 아래와 같이 map안에서 선언</p>
<pre><code class="language-js">const squared = numbers.map(n =&gt; n*n);</code></pre>
<h2 id="span-stylecolorvar--primary1margin-left2em-indexof-findindex-findspan"><span style="color:var(--primary1);margin-left:2em;"> indexOf, findIndex, find</span></h2>
<ul>
<li>indexOf : 배열에서 특정 요소의 index값 찾을 때 (텍스트일 경우)</li>
<li>findIndex : 배열에서 특정 요소의 index값 찾을 때 (<strong>객체</strong>일 경우, 조건있을 경우)</li>
<li>find : 배열에서 특정 요소를 찾아올 때</li>
</ul>
<blockquote>
<pre><code class="language-js">const index = numbers.indexOf(2); //1</code></pre>
</blockquote>
<pre><code>
## &lt;span style=&quot;color:var(--primary1);margin-left:2em;&quot;&gt; filter&lt;/span&gt;
- 조건에 맞는 배열만 찾아 새로운 배열을 반환

&gt;```js
const zoo = [
 {
   name: &quot;dog&quot;,
   sound: &quot;멍멍&quot;,
   leg: 4
 },
 {
   name: &quot;cat&quot;,
   sound: &quot;야옹&quot;,
   leg: 4
 },
 {
   name: &quot;bird&quot;,
   sound: &quot;짹짹&quot;,
   leg: 2
 }
];
const index = zoo.findIndex((animal) =&gt; animal.name === &quot;dog&quot;);
const animal = zoo.find((animal) =&gt; animal.name === &quot;dog&quot;);
const fourlegs = zoo.filter((animal) =&gt; animal.leg === 4);
console.log(index); // 0
console.log(animal); // {name: &quot;dog&quot;, sound: &quot;멍멍&quot;}
console.log(fourlegs); // [Object(dog), Object(Cat)]</code></pre><h2 id="span-stylecolorvar--primary1margin-left2em-concat-그리고--스프레드-연산자-span"><span style="color:var(--primary1);margin-left:2em;"> concat 그리고 &quot;...&quot; 스프레드 연산자 </span></h2>
<ul>
<li>배열 합치기 
아래 두 문장은 같은 결과
<span style="color:var(--destructive1)"><strong>*concat은 배열 껍데기를 벗길 때도 사용</strong></span></li>
</ul>
<blockquote>
<pre><code class="language-js">    const newArray = arr1.concat(arr2);
     const newArray = [...arr1, ...arr2];</code></pre>
</blockquote>
<pre><code>
## &lt;span style=&quot;color:var(--primary1);margin-left:2em;&quot;&gt; splice &amp; slice &lt;/span&gt;
- 배열 가져오기
두 함수의 매개변수와 효과가 다르니 주의!
  - splice(index, cnt); &lt;span style=&quot;color:var(--destructive1)&quot;&gt;***잘라온다**&lt;/span&gt; (원본 손상)
  - slice(start, end); &lt;span style=&quot;color:var(--primary2)&quot;&gt;***복사한다**&lt;/span&gt; (원본 유지)

## &lt;span style=&quot;color:var(--primary1);margin-left:2em;&quot;&gt; push, pop, shift, unshift &lt;/span&gt;
- 배열 안에 넣고 빼기


- |ㅤㅤㅤㅤㅤ|ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ|ㅤㅤㅤㅤㅤ|
|---|---|---|
|unshiftㅤㅤ➡️||⬅️ㅤㅤㅤpush|
||ㅤㅤㅤㅤㅤㅤ[배열]ㅤㅤㅤㅤㅤㅤ|ㅤㅤㅤㅤ|
|shiftㅤㅤㅤ⬅️|| ➡️ㅤㅤㅤpop|

- shift &amp; unshift : 인덱스를 변경하기 때문에 느리다
   - shift : 앞에서 뺌
   - unshift : 앞에서 넣음
- push &amp; pop : 배열 요소만 넣고 빼기 때문에 빠르다
  - push : 뒤에서 넣음
  - pop : 뒤에서 뺌


    ~~쉬운 개념인데 항상 쓸 때마다 헷갈렸는데.~~ _이제야 확실하게 알았다. shift 방식은 인덱스를 변경하는 방식이라는 것, 배열에 추가할 때는 당연히 뒤에 넣지 않는가. 퍼포먼스 차이도 이해했다._
    shift는 튀어나오게, unshift는 돌려놓는 느낌으로 기억하자.


## &lt;span style=&quot;color:var(--primary1);margin-left:2em;&quot;&gt; join &lt;/span&gt;
- 배열을 텍스트로 출력
&gt;```js
const numbers = [1, 2, 3];
console.log(numbers.join());    // 1,2,3
console.log(numbers.join(&quot;,&quot;)); // 1,2,3
console.log(numbers.join(&quot;&quot;));  // 123
console.log(numbers.join(&quot; &quot;)); // 1 2 3
console.log(numbers.join(&quot;-&quot;)); // 1-2-3</code></pre><p>```</p>
<p>... 남은 건 reduce ... 뒤에 이어집니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[javascript] 다시 완전 기초부터 - 01]]></title>
            <link>https://velog.io/@teo_ryu/javascript-%EB%8B%A4%EC%8B%9C-%EC%99%84%EC%A0%84-%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-01</link>
            <guid>https://velog.io/@teo_ryu/javascript-%EB%8B%A4%EC%8B%9C-%EC%99%84%EC%A0%84-%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-01</guid>
            <pubDate>Thu, 16 Jun 2022 20:02:27 GMT</pubDate>
            <description><![CDATA[<h1 id="돌아보기">돌아보기</h1>
<p>나에겐 개발자라고 하기엔 매우 안좋은 습관이 있다.</p>
<blockquote>
<ol>
<li><code>세련된 방식</code>을 찾아보지 않고 무식하게 개발한다.</li>
<li>노가다라도 돌아가면 <code>리팩토링</code> 안한다.</li>
<li><code>새로운 기술이나 문법</code>나오면 미룬다 <del>안본다</del>.</li>
</ol>
</blockquote>
<p>자바스크립트를 처음 접한 것이 하필 2015년이고 그 뒤로는 아는 수준으로만 개발을 해왔던 터라 ES6에 나온 문법들도 어색하다. <del>(라기엔 시간이 너무 흐른거 아닌가요)</del>
비개발자 직업의 한계랄까.. 강의를 조금만 들어도 바로 나오는 내용인데 항상 바쁘게 무작정 만들기부터 하다보니 이렇게 된 것 같다. 그래서 지금 아주 기초부터 강의를 듣는, 이 시간이 너무나 행복하고 보람차고 씻어내는 기분이든다.</p>
<h1 id="강의">강의</h1>
<blockquote>
<p>벨로퍼트와 함께하는 모던 자바스크립트</p>
<blockquote>
<p>1장. 자바스크립트 입문
<a href="https://learnjs.vlpt.us/basics/">https://learnjs.vlpt.us/basics/</a></p>
</blockquote>
</blockquote>
<h1 id="학습-내용">학습 내용</h1>
<h2 id="1-객체-구조분해-비구조화">1. 객체 구조분해 (비구조화)</h2>
<p>다음과 같은 과정으로 더 코드를 효율적으로 깔끔하게 쓸 수 있다.
아래 보기의 경우 1단계가 가장 쉬워보이지만 코드 줄이 길어지고 반복해서 쓰게되는 것을 줄일 수 있다. </p>
<blockquote>
<p>1단계</p>
</blockquote>
<pre><code class="language-js">function print(hero) {
    console.log(hero.name);
}</code></pre>
<p>2단계</p>
<pre><code class="language-js">function print(hero) {
    const { name, age } = hero;
    console.log(name);
}</code></pre>
<p>3단계</p>
<pre><code class="language-js">function print({ name, age }) {
    console.log(name);
}</code></pre>
<h2 id="2-화살표-함수">2. 화살표 함수</h2>
<blockquote>
</blockquote>
<p>1단계</p>
<pre><code class="language-js">화살표 함수
const dog = {
    sound: ‘멍멍&#39;,
    say: function() {
        console.log(this.sound);
    }
}</code></pre>
<p>메서드 축약 표현</p>
<pre><code class="language-js">const dog = {
    sound: ‘멍멍&#39;,
    say() { // 축약
        console.log(this.sound);
    }
}</code></pre>
<p><span style="color:var(--destructive1)"><strong>*화살표함수는 this를 사용할 경우 에러</strong></span></p>
<pre><code class="language-js">const dog = {
    sound: ‘멍멍&#39;,
    say: () =&gt; {
        console.log(this.sound);
    }
}
 // 에러 화살표 함수는 this를 모른다</code></pre>
<h2 id="3-gettersetter">3. getter/setter</h2>
<p>get, set을 설정해서 은닉</p>
<ol>
<li>프로퍼티명은 언더바로 설정 (getter, setter와 이름 분리)
<span style="color:var(--destructive1)"><strong>*프로퍼티명을 _언더바로 하지 않으면 루프에 빠지는 케이스 발생할 수 있음</strong></span>
<code>RangeError: Maximum call stack size exceeded</code></li>
</ol>
<p>*참고 : <a href="https://pxd-fed-blog.web.app/getter-setter/">https://pxd-fed-blog.web.app/getter-setter/</a></p>
<ol start="2">
<li><code>set</code> 구문은 <strong>객체의 속성에 할당을 시도할 때 호출할 함수를 바인딩</strong>
무슨말이냐면 보통의 함수처럼 ( )를 사용하지 않고 할당(대입)할 때 불러온다는 것</li>
</ol>
<blockquote>
<pre><code class="language-js">const numbers = {
    _a: 1,
    _b: 2,
    sum: 3,
    calculate() {
      console.log(‘calculate’);
      this.sum = this._a + this._b;    
    },
    get a() {
        return this._a;
    },
    get b() {
        return this._b;
    },
    set a(value) {
        this._a = value;
        this.calculate();
    },
    set b(value) {
        this._b = value;
        this.calculate();
    }
};
console.log(numbers.a); // getter
numbers.a = 5; // setter함수이기 때문에 set a안에 this.calculate()가 실행 -&gt; sum도 업데이트 됨
console.log(numbers.sum); // 7 *연산을 하지 않고 기존에 업데이트 값 읽음</code></pre>
</blockquote>
<pre><code></code></pre><h2 id="4-of-와-in">4. of 와 in</h2>
<h3 id="of--배열">of &gt;&gt;&gt;&gt; 배열</h3>
<blockquote>
<pre><code class="language-js">const numbers = [0, 1, 2]
for (let i of numbers) {
    ...
}</code></pre>
</blockquote>
<pre><code>

### in &gt;&gt;&gt;&gt; 객체
&gt;```js
const dog = {
    name: ‘강아지’,
    sound: ‘멍멍&#39;,
    age: 2
}
for (let i in dog) {
    console.log(i);         // “name”, “sound”, “age” *** key와 동일
    console.log(dog[i]);     // ”강아지&quot;, “멍멍&quot;, 2 *** values와 동일
}
console.log(Object.entries(dog));     // [[“name”,”강아지”], [“sound”,”멍멍”],[“age”,2]]
console.log(Object.keys(dog));         // [“name”, “sound”, “age”]
console.log(Object.values(dog));     // [“강아지&quot;, “멍멍&quot;, 2]</code></pre><h3 id="entries-keys-values">entries, keys, values</h3>
<p>위의 예시처럼 오브젝트의 메서드들이 있는데 아래의 메서드들도 자주 사용했던 것 같다.</p>
<ul>
<li>Object.freeze()</li>
<li>Object.getOwnPropertyNames()</li>
<li>Object.getPrototypeOf()</li>
<li>Object.values()</li>
</ul>
<blockquote>
<p>*참고 : <a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object</a></p>
</blockquote>
<h2 id="5-continue-break">5. continue, break</h2>
<p>break는 워낙 많이 사용하는데, continue는 써본 적이 없어서 볼 때마다 항상 새롭다..</p>
<blockquote>
<pre><code class="language-js">for (let i = 0; i &lt; 10; i++) {
    if (i===2) continue; // 다음 것
    if (i===5) break;
    console.log(i); // 0,1,3,4 *2는 continue에 의하여, 5는 break로 종료
}</code></pre>
</blockquote>
<p>```</p>
<p><em>배열 내장 함수는 다음 글에서 이어서...</em></p>
<h1 id="기타-메모">기타 메모</h1>
<h3 id="span-stylecolorvar--primary1margin-left2em-a-hrefhttpscodesandboxio-codesandboxio-a-span"><span style="color:var(--primary1);margin-left:2em;" ><a href="https://codesandbox.io"> codesandbox.io </a> </span></h3>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/efa4f503-7d0b-4d97-acce-1a9b13206647/image.png" alt=""></p>
<p>  온라인 코드 에디터로 <code>크롬 &gt; 더보기 &gt; CodeSandbox 설치</code> 로 바로 새 창으로 설치할 수도 있다.</p>
<h3 id="span-stylecolorvar--primary1margin-left2em-eslint-vs--prettierrcspan"><span style="color:var(--primary1);margin-left:2em;" >eslint VS  prettierrc</span></h3>
<p><strong>eslint</strong> :  코드 구현 방식을 방식을 일관성 있는 방식으로 구현
<strong>prettierrc</strong> : 줄 바꿈, 공백, 들여 쓰기 등 에디터에서 &#39;텍스트&#39;를 일관되게 작성</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[styled-components] JS안에 CSS 작성하기]]></title>
            <link>https://velog.io/@teo_ryu/styled-components</link>
            <guid>https://velog.io/@teo_ryu/styled-components</guid>
            <pubDate>Tue, 14 Jun 2022 18:41:29 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/teo_ryu/post/665f45ad-4415-485e-9143-d92fb74cff0b/image.png" alt=""></p>
<h1 id="강의-내용">강의 내용</h1>
<blockquote>
<p>벨로퍼트와 함께하는 모던 리액트 · GitBook</p>
<blockquote>
<p>2장. 리액트 컴포넌트 스타일링하기
2-3. styled-components
<a href="https://react.vlpt.us/styling/03-styled-components.html">https://react.vlpt.us/styling/03-styled-components.html</a></p>
</blockquote>
</blockquote>
<h2 id="1-styled-components란">1. [styled-components]란?</h2>
<p>CSS in JS : 자바스크립트 안에 css를 작성하는 것
styled components : 그 중 가장 인기 있는 라이브러리
그 외에 emotion, styled jsx, jss 등</p>
<h2 id="2-환경-세팅">2. 환경 세팅</h2>
<h3 id="2-1-설치">2-1. 설치</h3>
<p><strong>yarn add styled-components</strong></p>
<h3 id="2-2-vscode에서-스타일-적용">2-2. VSCode에서 스타일 적용</h3>
<p>마켓플레이스에서 <strong>vscode-styled-components</strong> 설치</p>
<h2 id="3-활용법">3. 활용법</h2>
<h3 id="3-1-template-literal-와-tagged-template-literal">3-1. Template Literal 와 Tagged Template Literal</h3>
<h4 id="1-template-literal">1) Template Literal</h4>
<p>백틱을 사용하는 문법
const message = `hello ${name}`;</p>
<h4 id="2-tagged-template-literal-중요">2) Tagged Template Literal *중요</h4>
<p>백틱을 함수처럼 사용하는 문법</p>
<blockquote>
<p>괄호 대신에 백틱으로 감싸주는 식으로 사용한다는 점이 흥미롭다.</p>
</blockquote>
<pre><code>const name = &quot;레옹&quot;;

function send(staticText, ...data) {
    console.log(staticText);
    console.log(data);
}
</code></pre><p>*<em>send`내 이름은 ${name}이야`; *</em></p>
<pre><code>결과
// [&#39;내 이름은 &#39;, &#39;이야&#39;]
// [&#39;레옹&#39;]</code></pre><p>send(`내 이름은 ${name}이야`); </p>
<pre><code>결과    
// &#39;내 이름은 레옹이야&#39;</code></pre><h3 id="3-2-스타일링-문법">3-2. 스타일링 문법</h3>
<p><code>import styled from &quot;styled-components&quot;;</code></p>
<h4 id="1-html-엘리먼트-스타일링">1) HTML 엘리먼트 스타일링</h4>
<pre><code>styled.button`
 /* css */
`;</code></pre><h4 id="2-button이라는-react-컴포넌트의-스타일링">2) &lt;Button&gt;이라는 React 컴포넌트의 스타일링</h4>
<pre><code>styled(Button)`
   /* css */
`;</code></pre><h2 id="4-기타">4. 기타</h2>
<h3 id="4-1-polished">4-1. Polished</h3>
<p>다양한 스타일 유틸 함수 라이브러리
<a href="https://polished.js.org/">https://polished.js.org/</a></p>
<h4 id="유틸-예시">유틸 예시</h4>
<ul>
<li>darken :</li>
<li>lighten :</li>
<li>cover : 컨텐츠를 풀로 채워주는</li>
<li>ellipsis <em>생략</em> : 텍스트가 넘치면 &#39;…&#39;으로 생략해주는</li>
</ul>
<h4 id="활용법-예시">활용법 예시</h4>
<p><code>import { darken, lighten } from &#39;polished&#39;;</code></p>
<pre><code>&amp;:hover {
    background: ${lighten(0.1, selected)};
}</code></pre><h3 id="4-2-themeprovider">4-2. ThemeProvider</h3>
<p>내부 컴포넌트에 스타일을 전달하는 방법
<a href="https://styled-components.com/docs/api#themeprovider">https://styled-components.com/docs/api#themeprovider</a></p>
<h4 id="활용법-예시-1">활용법 예시</h4>
<p><code>import styled, { ThemeProvider } from &#39;styled-components&#39;;</code></p>
<pre><code class="language-js">const palette = {
  blue: &#39;#228be6&#39;,
  gray: &#39;#496057&#39;,
  pink: &#39;#f06595&#39;
};

function App() {
  return (
    &lt;ThemeProvider theme={{palette}}&gt;
        &lt;Button&gt;&lt;/Button&gt;
    &lt;/ThemeProvider&gt;
  )
}

...
background: ${props =&gt; props.theme.palette.blue};</code></pre>
<h3 id="4-3-keyframes">4-3. keyframes</h3>
<p>@keyframes 규칙은 특정 지점들을 키프레임으로 설정함으로써 CSS 애니메이션 제어. 
<code>import styled, { keyframes } from &#39;styled-components&#39;;</code></p>
<pre><code class="language-css">@keyframes 이름 {
  from {
    width: 300%;
  }

  to {
    width: 100%;
  }
}</code></pre>
<p>위처럼 from ~ to를 사용하거나</p>
<pre><code class="language-css">@keyframes 이름 {
  0% { top: 0; left: 0; }
  30% { top: 50px; }
  68%, 72% { left: 50px; }
  100% { top: 100px; left: 100%; }
}</code></pre>
<p>위처럼 %로 타임라인을 직접 설정할 수 있음</p>
<blockquote>
<p>참고 : <a href="https://developer.mozilla.org/ko/docs/Web/CSS/@keyframes">https://developer.mozilla.org/ko/docs/Web/CSS/@keyframes</a></p>
</blockquote>
<h3 id="4-4-사라지는-트랜지션">4-4. 사라지는 트랜지션</h3>
<blockquote>
</blockquote>
<p>1.<code>useState</code>
사라지는 효과를 구현하려면 Dialog 컴포넌트에서 두개의 로컬 상태를 관리해야 함 </p>
<p>1) <code>animate</code> : 현재 트랜지션 효과를 보여주고 있는 중이라는 상태
2) <code>localVisible</code> : 실제로 컴포넌트가 사라지는 시점을 지연시키기 위한 값</p>
<blockquote>
<p>2.<code>useEffect</code> : <code>visible</code> 값이 true 에서 false 로 바뀌는 시점을 감지하여 <code>animate</code> 값을 true 로, setTimeout 함수를 사용하여 필요한 시간 이후 false로</p>
</blockquote>
<p>*<span style="color:red"> <code>localVisible</code> 이 없으면 컴포넌트가 처음 나타났을 때부터 실행됨, 전환되는 시점만 캐치해서 하기 위해서 필요 </span></p>
<pre><code class="language-js">function Dialog({ title, content, children, confirmText, cancelText, visible, onConfirm, onCancel}) {

    const [animate, setAnimate] = useState(false);
    const [localVisible, setLocalVisible] = useState(visible);

    useEffect(() =&gt; {
        if(localVisible &amp;&amp; !visible) {
            setAnimate(true);
            setTimeout(() =&gt; setAnimate(false), 250)
        }
        setLocalVisible(visible);
    }, [localVisible, visible]);

    if(!localVisible &amp;&amp; !animate) return null;
    return (
        &lt;DarkBackground dissapear={!visible}&gt;
            &lt;DialogBlock dissapear={!visible}&gt;
              ...생략...</code></pre>
<h2 id="5-이슈">5. 이슈</h2>
<h3 id="span-stylecolor-darkred---의-덮어쓰기-문제span"><span style="color: darkred"> &amp; + &amp;의 덮어쓰기 문제</span></h3>
<p>코드에 문제가 있나 싶었다가 테스트를 해보니 특정하게 문제가 있었는데, 찾아보니 역시 버전 이슈가 있었다.
<img src="https://velog.velcdn.com/images/teo_ryu/post/2343534e-ac56-47e1-bae7-2729f7993975/image.png" alt=""> <img src="https://velog.velcdn.com/images/teo_ryu/post/81d16e32-a0e1-42ea-a77c-8451f34e31cf/image.png" alt=""></p>
<h2 id="6-소감">6. 소감</h2>
<p>스타일링의 마지막인 styled-components를 경험해보면서 신기했지만 참 힘겨웠다. 뭐랄까 굳이 잘 정리된 체계를 무너뜨리며 하나에 담아야 하나.. 만약 CSS를 분업해서 담당하는 디자이너나 개발자가 따로 있다면 더더욱 안좋을 것 같다.
실제로 찾아보니 개발 효율성이나 컴포넌트 위주라면 <code>CSS in JS</code> 방식이 좋고, 그렇지 않다면 <code>CSS in CSS</code>를 유지하는 것이 좋다고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[웹 개발 로드맵] Front-end by 드림코딩]]></title>
            <link>https://velog.io/@teo_ryu/front-end-roadmap</link>
            <guid>https://velog.io/@teo_ryu/front-end-roadmap</guid>
            <pubDate>Mon, 13 Jun 2022 19:20:44 GMT</pubDate>
            <description><![CDATA[<h1 id="웹-개발-로드맵">웹 개발 로드맵</h1>
<p>우연히 유튜브를 통해서, 우리가 흔히 알고 있는 버전의 로드맵이 아닌 간략하게 정리한 버전의 로드맵을 보게 되었다. 워낙 정리도 잘 되어있고 핵심만 잘 설명해주신 점이 매우 유익하여서 벨로그에 따로 정리하게 되었다.  </p>
<blockquote>
<p><a href="https://www.youtube.com/watch?v=TTLHd3IyErM">https://www.youtube.com/watch?v=TTLHd3IyErM</a>
*출처 : 본문의 이미지는 모두 유튜버 &#39;드림코딩&#39;님의 <code>2022 웹개발 로드맵 총정리</code> 영상에서 캡쳐하여 사용했습니다. </p>
</blockquote>
<hr>
<h1 id="프론트엔드-front-end">프론트엔드 Front-end</h1>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/568ced0e-d5b5-4848-95d8-224f0d12bc3b/image.png" alt=""></p>
<h2 id="1-basic-tools">1. Basic Tools</h2>
<h4 id="컴퓨터">컴퓨터</h4>
<h4 id="텍스트-에디터">텍스트 에디터</h4>
<ul>
<li>VS CODE</li>
<li>장점 : 코드를 작성할 에디터, 무료 + 다양한 익스텐션<h4 id="브라우저">브라우저</h4>
</li>
<li>크롬 (+모든 브라우저 확인)<h4 id="터미널">터미널</h4>
</li>
<li>OS 기본 제공 터미널 사용</li>
</ul>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/40fa348c-5129-4b0e-a604-b4a56ecce789/image.png" alt=""></p>
<h2 id="2-front-end">2. Front-end</h2>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/5eba25ff-6d80-4a7f-9e26-d920aa21e577/image.png" alt=""></p>
<h3 id="2-1-html">2-1. HTML</h3>
<h4 id="1-html-tags">1) HTML Tags</h4>
<h4 id="2-page-structure">2) Page Structure</h4>
<h4 id="3-semantic-tags">3) Semantic Tags</h4>
<p><code>&lt;div&gt;</code>, <code>&lt;span&gt;</code> 등이 아닌 
<code>&lt;form&gt;</code>, <code>&lt;table&gt;</code>, and <code>&lt;article&gt;</code> 등 의미가 있는 태그를 사용해서 개발자와 브라우저가 이해하는 구조를 만들기</p>
<h4 id="4-seo">4) SEO</h4>
<p>SEO(Search Engine Optimization, 검색 엔진 최적화)는 웹사이트가 검색 결과에 더 잘 보이도록 최적화하는 과정. 크롤링 할 때 더 높은 순위를 매기도록 수정하여 검색 결과(SERPs)의 상단에 노출을 시키는 것. 검색엔진 마케팅의 영역으로 디지털 마케팅에서 중요.</p>
<h4 id="5-accessibility">5) Accessibility</h4>
<p>웹 접근성</p>
<hr>
<h3 id="2-2-css">2-2. CSS</h3>
<h4 id="1-styling">1) Styling</h4>
<h4 id="2-layouts">2) Layouts</h4>
<h4 id="3-responsive-design">3) Responsive Design</h4>
<h4 id="4-animation">4) Animation</h4>
<hr>
<h3 id="2-3-javascript">2-3. JavaScript</h3>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/bdd53a69-ed9d-43a6-ba85-1f70e39da8cc/image.png" alt=""></p>
<h4 id="1-es6-syntax">1) ES6+ Syntax</h4>
<h4 id="2-browser-apis">2) Browser APIs</h4>
<hr>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/91cbdaf2-a46b-438c-9799-998ecae12178/image.png" alt=""></p>
<h3 id="2-4-css-심화">+2-4. CSS 심화</h3>
<h4 id="1-bem-block-element-modifier">1) BEM (Block-Element-Modifier)</h4>
<p>CSS 클래스 이름 규칙 아키텍쳐로 
<code>.Block__Element--Modifier</code> 와 같이 이름을 짓는 방법을 말한다.
ex) <code>.header__form--email</code></p>
<p><em>다음에 나올 css 전처리기를 사용하면 활용할 일이 없긴하다. 게다가 [CSS in 2022]를 보면 Sass나 CSS Module의 기능까지도 포함하기 때문에 더더욱.. 레거시 파일들을 이해하는 정도로 알아두면 좋지 않을까</em></p>
<h4 id="2-preprocessors-전처리기">2) Preprocessors 전처리기</h4>
<p>Sass (Syntactically Awesome Style Sheets)</p>
<h4 id="3-css-in-js">3) CSS in JS</h4>
<p>Styled Components</p>
<h4 id="4-css-framework">4) CSS Framework</h4>
<p>이미 디자인된 요소를 가져와서 사용하는 것
Bootstrap
Material UI</p>
<p>*PostCSS는 처음 들었다.</p>
<h3 id="2-5-js-심화">+2-5. JS 심화</h3>
<h4 id="1-typescript">1) TypeScript</h4>
<ul>
<li>JS가 가지지 못한 &#39;타입&#39;과 &#39;객체지향&#39;을 개념을 가진 언어</li>
<li>규모있는 현업에서 사용한다고 함</li>
</ul>
<h4 id="2-js-framework">2) JS Framework</h4>
<ul>
<li>React</li>
</ul>
<h4 id="3-ssr">3) SSR</h4>
<ul>
<li>Next.js (React)<ul>
<li>SEO 보완</li>
<li>코드 분할 : 로딩 빠르게</li>
<li>페이지 기반 라우팅 제공</li>
</ul>
</li>
</ul>
<h4 id="4-ssg">4) SSG</h4>
<ul>
<li>Gatsby (React)</li>
</ul>
<h2 id="3-tools">3. Tools</h2>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/1e9d0ea6-4bdb-4f16-aa7c-d844bc7ded11/image.png" alt=""></p>
<h3 id="3-1-version-control-system--github">3-1. Version Control System : GitHub</h3>
<p>작업 히스토리 버전 관리</p>
<h3 id="3-2-package-manager--npm--yarn">3-2. Package Manager : npm &amp; yarn</h3>
<p>외부 라이브러리 관리</p>
<h3 id="3-3-module-bundler--webpack">3-3. Module Bundler : Webpack</h3>
<p>배포 시 압축</p>
<h2 id="4-testing">4. Testing</h2>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/1cae2366-3b0e-4b2d-843f-ac9811a87802/image.png" alt=""></p>
<h3 id="4-1-test-pyramid">4-1. Test Pyramid</h3>
<p>react-testing-library(React)</p>
<h3 id="4-2-good-test-principles">4-2. Good Test Principles</h3>
<p>? 무엇을 봐야하는지 모르겠다.</p>
<h3 id="4-3-cicd">4-3. CI/CD</h3>
<p>지속적인 통합 / 지속적인 제공 (Continuous Integration/Continuous Delivery). 빌드 시 여러 명의 개발자가 동시에 애플리케이션 개발과 관련된 코드 작업을 할 경우 서로 충돌할 수 있는 문제를 해결</p>
<h2 id="5-publish">5. Publish</h2>
<p>필요에 따른 배포 툴 활용</p>
<h4 id="aws">AWS</h4>
<h4 id="heroku">Heroku</h4>
<h4 id="netlify">Netlify</h4>
<h4 id="github-pages">Github Pages</h4>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/1f3dbd25-440a-4fc0-9710-d138c026f75e/image.png" alt=""></p>
<h1 id="백엔드-back-end">백엔드 Back-end</h1>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/3bc9cc25-2813-44b2-a6b6-b58da660e1dd/image.png" alt=""></p>
<h3 id="public-apis">Public APIs</h3>
<p>트위터나 유튜브 등 무료 공식 API 활용</p>
<h3 id="firebase">Firebase</h3>
<p>실시간 데이터 베이스 저장, API 활용</p>
<h3 id="nodejs">Node.js</h3>
<hr>
<h1 id="더-나아가서">더 나아가서</h1>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/9c86921b-22f2-4b02-be15-40f499788fa8/image.png" alt=""></p>
<h3 id="electron--desktop-app">Electron : Desktop App</h3>
<h3 id="react-native-rn--mobile">React-Native (RN) : Mobile</h3>
<p><img src="https://velog.velcdn.com/images/teo_ryu/post/63cae4e8-35e8-445c-9012-42675f3de061/image.png" alt=""></p>
<h3 id="web-assembly">Web Assembly</h3>
<p>특정하게 성능이 중요한 경우 ex) 비디오, 이미지 등의 처리</p>
<h3 id="graphql-vs-rest-api">GraphQL vs REST Api</h3>
<h4 id="graphql">GraphQL</h4>
<ul>
<li>페이스북에서 만든 쿼리언어</li>
<li>엄격하게 정의된, 최소한의 원하는 데이터 유형만 요청하고 받아옴</li>
<li>👍 하나의 Query(Endpoint)에 모두 담아 요청가능하기 때문에 요청 횟수와 응답 줄일 수 있음</li>
<li>👎 Text로만 하기 힘든 내용을 처리하기 복잡 ex) file 전송 / 재귀적인 Query 불가<h4 id="apollo">Apollo</h4>
</li>
<li>GraphQL을 편하게 사용할 수 있도록 도와주는 라이브러리<h4 id="restful">RESTful</h4>
</li>
<li>Resource마다 하나의 Endpoint를 가지고 있음</li>
<li>요청의 구조가 정해져 있을 때</li>
<li>👍 HTTP와 HTTPs에 의한 caching<blockquote>
<p>*참고 : 
GraphQL vs REST <a href="https://www.holaxprogramming.com/2018/01/20/graphql-vs-restful-api/">https://www.holaxprogramming.com/2018/01/20/graphql-vs-restful-api/</a>
REST? <a href="https://dev-coco.tistory.com/97">https://dev-coco.tistory.com/97</a></p>
</blockquote>
</li>
</ul>
<hr>
<h1 id="강제로-접해서-눈물나게-만든-지식들">강제로 접해서 눈물나게 만든 지식들</h1>
<h3 id="1-cms-content-management-system">1. CMS (Content Management System)</h3>
<p>*CMS란? WordPress, Wix처럼 전문 기술 없는 유저가 쉽게 디지털 컨텐츠를 구축, 생성, 관리할 수 있는 서비스.
Traditional CMS - 마케터에게 친숙, 프론트엔드 요소
Headless CMS - 개발자에게 친숙, API기반, 디바이스 제한이 없음 (HEAD = PC-모바일-워치 등)
Serverless CMS - 두 가지 결합
<a href="https://www.techmagic.co/blog/headless-vs-serverless-cms/">https://www.techmagic.co/blog/headless-vs-serverless-cms/</a>
SSG에서 여기까지 왔다. 웹빌더, SI, 요즘 트렌드인 노코드와도 관련이 있어보인다. 그만 알아보자.</p>
<h3 id="2-spa-vs-mpa">2. SPA vs MPA</h3>
<h4 id="1-spa-single-page-application">1) SPA (Single Page Application)</h4>
<ul>
<li>활용 : 대체로 역동적이고 섬세한 웹 어플리케이션 ex) 구글맵</li>
<li>방식 : 브라우저에서 자바스크립트를 이용하여 단일 웹페이지에 동적으로 생성</li>
<li>클라이언트 측에서 비동기로 처리, AJAX(비동기)</li>
<li>대표 : React</li>
<li>장점 👍 : UX (깜빡거림 없음), 한 번 요청하여 캐시로</li>
<li>단점 👎 : 자바스크립트 의존, 클라이언트 코드 양이 많아 로딩 느림, 웹크롤링 제한, 보안 이슈</li>
</ul>
<h4 id="2-mpa-multiple-page-application">2) MPA (Multiple Page Application)</h4>
<ul>
<li>SSR 방식</li>
</ul>
<h3 id="3-csr-vs-ssr-vs-ssg">3. CSR vs SSR vs SSG</h3>
<h4 id="1-csr-client-side-rendering">1) CSR (Client Side Rendering)</h4>
<p>= SPA</p>
<h4 id="2-ssr-server-side-rendering">2) SSR (Server-Side Rendering)</h4>
<ul>
<li>활용 : 전자상거래 플랫폼, SNS 서비스</li>
<li>핵심 : 서버측에서 렌더링</li>
<li>방식 : 클라이언트 요청이 들어올 때마다 실시간으로 웹을 만들어냄</li>
<li>데이터 즉시 반영, 유저마다 다른 경험</li>
<li>대표 : Next.js</li>
<li>장점 👍 : 초기 렌더링 빠름, SEO 크롤링 적합</li>
<li>단점 👎 : 페이지마다 새로고침, 트래픽, 서버 부하</li>
</ul>
<h4 id="3-ssg-static-site-generator">3) SSG (Static Site Generator)</h4>
<ul>
<li>활용 : 제품 카탈로그, 개인 블로그 등 컨텐츠의 변경이 없는 소규모 웹</li>
<li>방식 : 서버가 웹사이트 전체를 만들어놓고 </li>
<li>대표 : Gatsby</li>
<li>장점 👍 : 속도가 빠르다, SEO 크롤링에 적합</li>
<li>단점 👎 : 큰 프로젝트 빌드에 비효율</li>
</ul>
<p>+ 여러 방식을 보완한 하이브리드 방식 : Universal Rendering, ISR (Incremental Static Regeneration)</p>
<blockquote>
<p>*참고 : </p>
</blockquote>
<ul>
<li><a href="https://velog.io/@goodenough/Web-Development-CSRSSR-%EC%9D%B4%EB%9E%80-feat.-SPAMPA">https://velog.io/@goodenough/Web-Development-CSRSSR-%EC%9D%B4%EB%9E%80-feat.-SPAMPA</a></li>
<li><a href="https://ajdkfl6445.gitbook.io/study/web/csr-vs-ssr-vs-ssg">https://ajdkfl6445.gitbook.io/study/web/csr-vs-ssr-vs-ssg</a></li>
</ul>
<h3 id="4-객체지향-vs-함수형">4. 객체지향 vs 함수형</h3>
<p>명령형 - HOW 절차지향, 객체지향
선언형 - WHAT 함수형</p>
<ul>
<li><p><img src="https://velog.velcdn.com/images/teo_ryu/post/f6dca789-79f6-40b3-b9dc-9c2166994d2f/image.png" alt=""></p>
<ul>
<li><img src="https://velog.velcdn.com/images/teo_ryu/post/9ac5e102-aaa4-438a-8354-50bcea8ea7c3/image.png" alt=""></li>
</ul>
</li>
</ul>
<blockquote>
<p>*이미지 출처 : 얄팍한 코딩사전 <a href="https://www.youtube.com/watch?v=KDiE5qQ3bZI">https://www.youtube.com/watch?v=KDiE5qQ3bZI</a></p>
</blockquote>
<h4 id="1-절차지향-procedural">1) 절차지향 Procedural</h4>
<ul>
<li>대표 : C언어</li>
<li>특징 : 사람의 사고방식과 유사, 서비스 플로우 관점</li>
<li>👍 컴퓨터의 처리구조와 유사해 실행속도가 빠르다.</li>
<li>👎 유지보수, 디버깅 어려움</li>
</ul>
<h4 id="2-객체지향-oop-object-oriented-programming">2) 객체지향 OOP Object-oriented Programming</h4>
<ul>
<li>대표 : C++, JAVA, Python, React(클래스형)</li>
<li>특징 : 추상화, 캡슐화, 상속, 다형성</li>
<li>👍 코드 재활용, 디버깅 쉬움</li>
<li>👎 느림, 설계 어려움</li>
</ul>
<p><em>*절차지향과 객체지향은 반대되는 개념이 아니다.</em></p>
<h4 id="3-함수형-fp-functional-programming">3) 함수형 FP Functional Programming</h4>
<ul>
<li>대표 : React(함수형)</li>
<li>👍 방대한 데이터를 빠르게 병렬적으로 처리</li>
<li>AI, IoT, 빅데이터, 비트코인 등이 뜨면서 주목</li>
<li>특징 : 순수함수, 비상태, 불변성, 일급함수 First-class, 고차함수 Higher-order function, Only Expression <ul>
<li>Expression - </li>
<li>Statement - if, switch, for...</li>
</ul>
</li>
<li>데이터 변경없이 <code>map</code> <code>reduce</code>등 복사본 함수 사용</li>
</ul>
<h4 id="4-함수형-반응형-frp">4) 함수형 반응형 FRP</h4>
<ul>
<li>대표 : ReactiveX 라이브러리</li>
<li>시간의 흐름, 사용자의 동작, 네트워크 요청의 결과까지 흐름으로 만들어서 파이프라인 처리</li>
<li>거의 다른 차원의 이야기라서 유튜브로 설명 대체... 
얄팍한 코딩사전 - <a href="https://www.youtube.com/watch?v=KDiE5qQ3bZI">https://www.youtube.com/watch?v=KDiE5qQ3bZI</a></li>
</ul>
<blockquote>
<p>*참고 : 
선언형, 명령형 프로그래밍 <a href="https://velog.io/@blackb0x/%EC%84%A0%EC%96%B8%ED%98%95-%EB%AA%85%EB%A0%B9%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D">https://velog.io/@blackb0x/%EC%84%A0%EC%96%B8%ED%98%95-%EB%AA%85%EB%A0%B9%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</a>
함수형프로그래밍이 대세다?! (함수형 vs 객체지향) - 드림코딩 
<a href="https://www.youtube.com/watch?v=4ezXhCuT2mw">https://www.youtube.com/watch?v=4ezXhCuT2mw</a>
리액트 함수형 vs 클래스형 <a href="https://devowen.com/298">https://devowen.com/298</a></p>
</blockquote>
<h1 id="기타-참고">기타 참고</h1>
<p>*로드맵 - 프론트엔드 &amp; 백엔드
<img src="https://velog.velcdn.com/images/teo_ryu/post/c5008414-1618-4e41-8398-d670f011744d/image.jpg" alt=""></p>
<p><a href="https://roadmap.sh/frontend">https://roadmap.sh/frontend</a>
<a href="https://roadmap.sh/backend">https://roadmap.sh/backend</a>
이미지로는 많이 봤는데 하나하나 항목별로 클릭할 수 있는 하이퍼링크가 있는 웹사이트 인건 처음 알았다. 누르면 어디서 무엇을 공부하라고 링크가 걸려있다. 일종의 목차같은 
하지만 못생기고 복잡해서 싫다. 더 어렵게 느껴지는듯 😿.</p>
<h1 id="소감">소감</h1>
<p>어째 모르는 키워들 찾아서보다가 배보다 배꼽이 더 큰 글이 되었다. 시간도.. 가볍게 유튜브 본 거 정리하려다가 거의 강의 정리한 것보다 더 많이 들었네.
로드맵을 정리하면서 좋았던 것이 이름만 들어봤던 것들, 어디에 붙어있는지 몰랐던 것들을 자리정리를 해서 머리가 맑아진 느낌이다. 막막했던 것들도 걷히고 생각보다 웹 개발에 전반적인 경험과 지식이 있다는 자신감도 생겼다.</p>
<p>앞으로 나에게 필요한 것은 이 세 가지가 아닐까.</p>
<ol>
<li><code>실전의 경험</code> 2. <code>습관화</code> 3. <code>고급 기술로 레벨업</code></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS Module] css 이름 꼬이지 않고 편하게 쓰기]]></title>
            <link>https://velog.io/@teo_ryu/CSS-Module-css-%EC%9D%B4%EB%A6%84-%EA%BC%AC%EC%9D%B4%EC%A7%80-%EC%95%8A%EA%B3%A0-%ED%8E%B8%ED%95%98%EA%B2%8C-%EC%93%B0%EA%B8%B0</link>
            <guid>https://velog.io/@teo_ryu/CSS-Module-css-%EC%9D%B4%EB%A6%84-%EA%BC%AC%EC%9D%B4%EC%A7%80-%EC%95%8A%EA%B3%A0-%ED%8E%B8%ED%95%98%EA%B2%8C-%EC%93%B0%EA%B8%B0</guid>
            <pubDate>Thu, 09 Jun 2022 19:33:01 GMT</pubDate>
            <description><![CDATA[<h1 id="강의-내용">강의 내용</h1>
<blockquote>
<p>벨로퍼트와 함께하는 모던 리액트 · GitBook</p>
<blockquote>
<p>2장. 리액트 컴포넌트 스타일링하기
2-2. CSS Module
<a href="https://react.vlpt.us/styling/02-css-module.html">https://react.vlpt.us/styling/02-css-module.html</a></p>
</blockquote>
</blockquote>
<h2 id="css-module이란">CSS module이란?</h2>
<p>컴포넌트 별로 CSS를 적용해주어 다른 컴포넌트의 동일 이름과 충돌되지 않도록 해주는 방식 (아래의 이미지처럼 별도의 key값을 알아서 붙여줌)</p>
<ul>
<li>기존 커다란 프로젝트가 있을 때 네이밍 규칙을 고민하지 않아도 되기 때문에 매우 유용함
<img src="https://velog.velcdn.com/images/teo_ryu/post/985e01c7-bfeb-482f-a556-041cb50ff7bb/image.png" alt=""></li>
</ul>
<h2 id="사용-방법">사용 방법</h2>
<h4 id="프로젝트-생성">프로젝트 생성</h4>
<p><code>npx create-react-app</code> 이름 // ** <em>별도의 설치가 필요 없음*</em></p>
<h3 id="파일-이름-규칙">파일 이름 규칙</h3>
<p>1) 파일을 만들 때 파일명을 <strong>.module.css</strong> 또는 <strong>.module.scss</strong>로 끝내면 된다.
2) 불러올 때 <strong><code>import styles from “./파일명.module.css”</code></strong>; 로 불러오면 끝</p>
<h3 id="리액트-아이콘-사용">리액트 아이콘 사용</h3>
<p>설치 : <code>yarn add react-icons</code>
링크 : <a href="https://react-icons.github.io/react-icons/">https://react-icons.github.io/react-icons/</a></p>
<ul>
<li>사이트에서 각 아이콘 불러오는 법이 나와 있음</li>
</ul>
<p>아래와 같이 컴포넌트식으로 불러와 사용 가능</p>
<pre><code>import { MdCheckBox, MdCheckBoxOutlineBlank } from &#39;react-icons/md&#39;;

 &lt;div&gt;&lt;MdCheckBox/&gt;&lt;/div&gt;
</code></pre><h3 id="글로벌로컬-사용-법">글로벌/로컬 사용 법</h3>
<p>모듈 사용 시 글로벌화</p>
<pre><code>/* sample.module.css */
:global .name {
}

/* sample.module.scss */
:global {
.name { }
}</code></pre><p>모듈을 사용하지 않았을 때 로컬화</p>
<pre><code>/* sample.css */
:local .name {
}

/* sample.scss */
:local {
.name { }
}</code></pre><h3 id="classnames의-활용-bind">classnames의 활용 bind</h3>
<p>설치 : <code>yarn add classnames</code></p>
<p>백틱을 이용해서 아래와 같이 적어야하는 것을 classnames의 bind를 사용하면 줄여서 쓸 수 있다</p>
<blockquote>
<p>`$(styles.checkbox) $(styles.noname)`</p>
</blockquote>
<blockquote>
<p><code>import classNames from ‘classnames/bind’;</code> 
<code>const cx = classNames.bind(styles);</code>
<code>cx(&#39;checkbox&#39;, &#39;noname&#39;)</code></p>
</blockquote>
<h2 id="코드">코드</h2>
<p><strong>CheckBox.js</strong></p>
<pre><code>import React from &#39;react&#39;;
import styles from &#39;./CheckBox.module.css&#39;; // (1) 모듈
import { MdCheckBox, MdCheckBoxOutlineBlank } from &#39;react-icons/md&#39;; // (2) 아이콘 불러오기
import classNames from &#39;classnames/bind&#39;; // (3) 바인드 불러오기

const cx = classNames.bind(styles); // (3) 바인드 활용

function CheckBox({checked, children, ...rest}) {
    return (
        &lt;div className={cx(&#39;checkbox&#39;, &#39;noname&#39;)}&gt; // (3) 바인드 활용
            &lt;label&gt;
                &lt;input type=&quot;checkbox&quot; checked={checked} {...rest}/&gt;
                &lt;div className={styles.icon}&gt;{checked ? &lt;MdCheckBox className={styles.checked}/&gt; : &lt;MdCheckBoxOutlineBlank/&gt;}&lt;/div&gt; // (2) 아이콘 불러오기
            &lt;/label&gt;
            &lt;span&gt;{children}&lt;/span&gt;
        &lt;/div&gt;
    );
}

export default CheckBox;</code></pre><p><strong>App.js</strong></p>
<pre><code>import CheckBox from &quot;./components/CheckBox&quot;;
import React, { useState } from &#39;react&#39;;

function App() {
  const [check, setCheck] = useState(false);
  const onChange = (e) =&gt; {
    setCheck(e.target.checked);
  }
  return (
    &lt;div className=&quot;App&quot;&gt;
      &lt;CheckBox onChange={onChange} checked={check}&gt; 다음 약관에 모두 동의 &lt;/CheckBox&gt;
    &lt;/div&gt;
  );
}

export default App;</code></pre><h2 id="팁-메모">팁 메모</h2>
<h4 id="netlify-네트리파이-httpswwwnetlifycom">netlify 네트리파이 <a href="https://www.netlify.com/">https://www.netlify.com/</a></h4>
<ul>
<li>정적 사이트 배포 / 호스팅</li>
<li>개인 사이트 목적이면 무료, 커스텀 도메인 설정 가능, 깃허브와 연결해서 저장소에 바로 푸시 빌드, 보안도 쉽게 해결</li>
<li>정보 : <a href="https://blog.outsider.ne.kr/1417">https://blog.outsider.ne.kr/1417</a></li>
</ul>
<h4 id="벨로그에서-백틱-하나만-쓰면-코드-뭉치-표시가능">벨로그에서 백틱 하나만 쓰면 코드 뭉치 표시가능</h4>
<p>ex) <code>벨로그</code> // 참고로 맥에서 백틱 입력은 <code>option</code>+<code>₩</code>
노션에서도 되었던 것 같은데 까먹고 있었다.</p>
<h3 id="소감">소감</h3>
<p><em>강의 내용이 아주 유용했다.
강의를 듣는 건 굉장히 빠른데 다시 정리해서 쓰는데 생각보다 걸린다.
그 이유는 다시 정확하게 쓰려고 찾게 되다보니..
하지만 내 것으로 만드는 것이기도 하고 정확하게 알려는 습관이 드는 것이라 생각하고 꾸준히 하리라</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SASS/SCSS]  스타일링 기초]]></title>
            <link>https://velog.io/@teo_ryu/SASS-styling</link>
            <guid>https://velog.io/@teo_ryu/SASS-styling</guid>
            <pubDate>Wed, 08 Jun 2022 18:44:37 GMT</pubDate>
            <description><![CDATA[<h1 id="강의내용">강의내용</h1>
<blockquote>
</blockquote>
<p>패스트캠퍼스 React.js 올인원 패키지 Online
벨로퍼트&#39;s 컴포넌트 스타일링
Sass 버튼</p>
<h2 id="sass란">SASS란?</h2>
<p>Syntactically awesome stylesheets 문법적으로 멋진 스타일시트
*가이드라인 : <a href="https://Sass-Guidelin.es/ko/">https://Sass-Guidelin.es/ko/</a></p>
<h4 id="sass-vs-scss">SASS vs SCSS</h4>
<p>SASS : 중괄호, 세미콜론 사용하지 않음
SCSS : CSS문법과 유사
*두 문법의 차이 예제 : <a href="https://sass-lang.com/guide">https://sass-lang.com/guide</a></p>
<h2 id="개발환경-세팅">개발환경 세팅</h2>
<ol>
<li>npx create-react-app 이름</li>
</ol>
<p>*npx : 로컬에 패키지 남기지 않고, 최신버전 유지하는 방식
*참고 : <a href="https://velog.io/@kimkyeseung/%EB%B2%88%EC%97%AD-%EA%B7%B8%EB%9E%98-npx-npm%EB%A7%90%EA%B3%A0-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%84%A4%EB%AA%85">https://velog.io/@kimkyeseung/%EB%B2%88%EC%97%AD-%EA%B7%B8%EB%9E%98-npx-npm%EB%A7%90%EA%B3%A0-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%84%A4%EB%AA%85</a></p>
<ol start="2">
<li>VS에서 Code라는 명령어 사용해서 새 프로젝트 열기</li>
</ol>
<p>*참고 : <a href="https://jsikim1.tistory.com/194">https://jsikim1.tistory.com/194</a></p>
<ul>
<li>F1키 눌러서, install code 입력, ‘code’라는 command in PATH 설치</li>
<li>code ./이름</li>
</ul>
<ol start="3">
<li><p>yarn add <strong>node-sass</strong>
sass설치</p>
</li>
<li><p>yarn add <strong>classnames</strong>
classnames라는 라이브러리 설치</p>
</li>
</ol>
<h2 id="css-셀렉터">CSS 셀렉터</h2>
<pre><code>* - all
. - class
# - id
, - and</code></pre><pre><code>div &gt; p - 자식
div p - 자손
div+div - 인접한 형제 선택
div ~ p - 다음의 모든 형제 선택</code></pre><blockquote>
</blockquote>
<p>예시</p>
<pre><code>&lt;h1&gt; &lt;/h1&gt;
&lt;p&gt; &lt;/p&gt; // ①
&lt;p&gt; &lt;/p&gt; // ②
&lt;p&gt; &lt;/p&gt; // ③</code></pre><p>h1+p : ①
p+p : ②,③
h1 ~ p : ①,②,③</p>
<p>selector 종류와 사용법
*참고 : <a href="https://webty.tistory.com/60">https://webty.tistory.com/60</a></p>
<h2 id="extend-mixin-사용">@extend, @mixin 사용</h2>
<p>반복하는 css 코드를 변수처럼 가져와 사용할 수 있음</p>
<ol>
<li><strong>$</strong>변수</li>
<li><strong>@extend</strong> 이름 // 그대로 불러오기</li>
<li><strong>@mixin</strong> 이름($인자: 디폴드값) { }</li>
</ol>
<p>-&gt; <strong>@include</strong> 이름(인자값)</p>
<p>예시</p>
<pre><code>$blue: #228be6;
$pink: #f06595;

@mixin button-color($color){
        background: $color;
        &amp;:hover{
            background: lighten($color, 10%);
        }
        &amp;:active {
            background: darken($color, 10%);
        }
}

.Button {
    &amp;.blue {
        @include button-color($blue)
    }

    &amp;.pink {
        @include button-color($pink)
    }

    &amp; + &amp; {
        margin-left: 1rem;
    }
}</code></pre><h2 id="버튼-생성-컴포넌트">버튼 생성 컴포넌트</h2>
<pre><code>import React from &#39;react&#39;;
import classNames from &#39;classnames&#39;; // 1
import &#39;./Button.scss&#39;;

function Button({ children, size, color, outline, fullWidth, className, ...rest }) {
    return (
        &lt;button 
            className={classNames( // 1
                &#39;Button&#39;, // 1-①
                size, // 1-②
                color, 
                {
                    outline, // 1-③
                    fullWidth
                }, 
                className // 2-①
            )}
            {...rest} // 2-②
        &gt; 
            {children} 
        &lt;/button&gt;
    );
}

Button.defaultProps = { // 3
    size: &#39;medium&#39;,
    color: &#39;blue&#39;
}

export default Button;</code></pre><pre><code>  &lt;div className=&quot;buttons&quot;&gt;
    &lt;Button className=&quot;customized-button&quot;&gt; Text &lt;/Button&gt;
    &lt;Button fullWidth outline={true} color=&quot;pink&quot; size=&quot;small&quot;&gt; Text &lt;/Button&gt;
    &lt;Button onClick={() =&gt; console.log(&#39;클릭&#39;)} onMouseMove={() =&gt; console.log(&#39;움직임&#39;)}&gt; Text &lt;/Button&gt;
  &lt;/div&gt;</code></pre><ol>
<li><p>classNames 라이브러리를 활용
 ① 최상위 엘리먼트 클래스이름 = 컴포넌트 이름 &#39;Button&#39; <em>(클래스가 겹치지 않도록 정리하는 것)</em>
 ② string 파라미터 &#39;size, color&#39;
 ③ boolen은 객체로 &#39;outline, fullWidth&#39;</p>
</li>
<li><p>재사용성 높이기
 ① <strong>스프레드 연산자</strong>를 활용한 …rest props 전달하기
onClick, onMouseMove 등의 추가적인 키워드를 한 번에 받아옴
 ② className을 추가로 받아서 커스텀 클래스에 대비하여 스타일링</p>
</li>
<li><p>defaultProps 분리 (리덕스 개발자도구에서 볼 수 있도록)</p>
</li>
</ol>
<p>*참고 : 스프레드 연산자 (three dots)
<a href="https://dinn.github.io/javascript/js-dotdotdot/">https://dinn.github.io/javascript/js-dotdotdot/</a></p>
<h3 id="defaultprops-분리-및-다른-방법-코드-비교">defaultProps 분리 및 다른 방법 코드 비교</h3>
<p><strong>1. defaultProps 분리</strong> <del>가장 이상적인 방법</del></p>
<pre><code>function Button({ children, size }) {
   return (
       &lt;button className={classNames(&#39;Button&#39;, size)}&gt; {children} &lt;/button&gt;
   );
}

Button.defaultProps = {
   size: &#39;medium&#39;
}</code></pre><ol start="2">
<li>매개변수 기본값<pre><code>function Button({ children, size = &#39;medium&#39;}) {
return (
    &lt;button className={classNames(&#39;Button&#39;, size)}&gt; {children} &lt;/button&gt;
);
}</code></pre></li>
<li>OR 연산자<pre><code></code></pre></li>
</ol>
<p>function Button({ children, size = &#39;medium&#39;}) {
   return (
       &lt;button className={classNames(&#39;Button&#39;, size || &#39;medium&#39;)}&gt; {children} </button>
   );</p>
<pre><code>
## 팁 메모
반복되는 키워드 일괄 수정 : 블록처리 한 다음 **[cmd+d]** 를 누를 때마다 다음 키워드를 추가로 잡음</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] 게임으로 배우는 flex ]]></title>
            <link>https://velog.io/@teo_ryu/CSS-%EA%B2%8C%EC%9E%84%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-flex</link>
            <guid>https://velog.io/@teo_ryu/CSS-%EA%B2%8C%EC%9E%84%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-flex</guid>
            <pubDate>Tue, 07 Jun 2022 17:51:23 GMT</pubDate>
            <description><![CDATA[<h1 id="flexbox-froggy">FLEXBOX FROGGY</h1>
<p><a href="https://flexboxfroggy.com">https://flexboxfroggy.com</a>
<img src="https://velog.velcdn.com/images/teo_ryu/post/49cb13e4-eb99-418c-a23c-5d7659d08501/image.png" alt=""> 
<strong>Flexbox Froggy</strong>는 웹에서 간단하게 CSS의 FLEX개념을 배울 수 있는 웹 게임이다.
<em>CSS에서 flex는 막상 쓸 상황에는 조급해지고 쓸 때마다 마음대로 되지 않아서 짜증나는 개념이었는데 24개의 문제를 풀며 순차적으로 익히다보니 편하고 재미있었다. <del>강의 중간에 소개를 받아서 잠시 한 눈을 팔았다. 들어야 할 강의는 안듣고...</del></em></p>
<blockquote>
<p>아래의 CSS 속성들을 배울 수 있다.</p>
</blockquote>
<ul>
<li>justify-content</li>
<li>align-items</li>
<li>flex-direction</li>
<li>order</li>
<li>align-self</li>
<li>flex-wrap</li>
<li>flex-flow</li>
<li>align-content</li>
</ul>
<h4 id="마지막-문제-풀이">마지막 문제 풀이</h4>
<p>개구리 친구들과 헤어지는 것이 아쉬워서 기록했다.
<img src="https://velog.velcdn.com/images/teo_ryu/post/12945170-69fe-48f0-966f-d09931f0d4e5/image.gif" alt=""></p>
<p>ㅤ
ㅤ
ㅤ</p>
<h1 id="grid-garden">GRID GARDEN</h1>
<p>시리즈로 CSS grid를 배우는 <strong>GRID GARDEN</strong>도 있다. 나중에 풀어봐야겠다.
<a href="https://cssgridgarden.com/">https://cssgridgarden.com/</a>
<img src="https://velog.velcdn.com/images/teo_ryu/post/39b3abf8-a31b-46d4-9573-abb0c9e34c0b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] 하루만에 간단히 빠르게 익혀보기]]></title>
            <link>https://velog.io/@teo_ryu/Vue-%ED%95%98%EB%A3%A8%EB%A7%8C%EC%97%90-%EA%B0%84%EB%8B%A8%ED%9E%88-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EC%9D%B5%ED%98%80%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@teo_ryu/Vue-%ED%95%98%EB%A3%A8%EB%A7%8C%EC%97%90-%EA%B0%84%EB%8B%A8%ED%9E%88-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EC%9D%B5%ED%98%80%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Mon, 06 Jun 2022 14:23:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/teo_ryu/post/dda518be-c119-4e9c-8413-83cce5b73260/image.png" alt="Vue 순위">출처 : <a href="https://2020.stateofjs.com/ko-KR/technologies/front-end-frameworks/">https://2020.stateofjs.com/ko-KR/technologies/front-end-frameworks/</a></p>
<p><strong>Vue</strong>는 가장 강력한 <strong>React</strong>와 비교해서 활용도와 관심도면에서 나름 비벼볼만한 프론트엔드 프레임워크이다.
<del>(물론 그래프만 봐도 알 수 있듯이 새롭게 떠오르는 <strong>Svelte</strong>를 더 주목해야 하는 상황)</del></p>
<h4 id="리액트-vs-뷰-장단점-비교">리액트 VS 뷰 (장단점 비교)</h4>
<blockquote>
<p>아래의 두 글에도 정리되어 있는 것처럼 일반적으로 Vue는 React에 비해 <strong>소규모로 덜 능숙한 개발자가 참여하는 프로젝트</strong>에 좋을 것이라는 평이 있다.</p>
</blockquote>
<ul>
<li>출처 : </li>
<li><a href="https://velog.io/@leehaeun0/React-vs-Vue-%EC%9E%A5%EB%8B%A8%EC%A0%90-%EB%B9%84%EA%B5%90">https://velog.io/@leehaeun0/React-vs-Vue-%EC%9E%A5%EB%8B%A8%EC%A0%90-%EB%B9%84%EA%B5%90</a></li>
<li><a href="https://ahnheejong.name/articles/why-i-prefer-react-over-vuejs/">https://ahnheejong.name/articles/why-i-prefer-react-over-vuejs/</a></li>
</ul>
<h1 id="강의-내용">강의 내용</h1>
<blockquote>
<ul>
<li>패스트캠퍼스 React.js 올인원 패키지 Online</li>
</ul>
</blockquote>
<ul>
<li>더 나은 사용자 경험을 위한 UI 컴포넌트 제작</li>
<li>Form, Toast, ProgressBar 구현</li>
</ul>
<p>*아래의 메모 내용은 대부분 위 강의를 기반으로 한 내용임을 미리 밝힙니다.</p>
<h3 id="1-개발환경-세팅">1. 개발환경 세팅</h3>
<h4 id="vue-cli--vue-개발-환경을-설정해주는-도구">Vue-CLI : vue 개발 환경을 설정해주는 도구</h4>
<ul>
<li>설치 : npm install -g @vue/cli</li>
<li>생성 : vue create (이름) 
 → 생성할 프로젝트 환경 선택</li>
<li>이동 : cd (이름)        </li>
<li>실행 : npm run serve     </li>
</ul>
<h4 id="vs-code-extensions">VS code extensions</h4>
<ul>
<li><strong>Vetur</strong> : VS Code에서 뷰 지원<ul>
<li><strong>Vue VSCode Snippets</strong> : 일부 안되는 현상이 있어서 추가로 설치</li>
</ul>
</li>
</ul>
<h3 id="2-뷰-특징">2. 뷰 특징</h3>
<ol>
<li>컴포넌트 기반 개발 방식</li>
</ol>
<ul>
<li>화면을 여러 개의 작은 단위로 쪼개어 개발</li>
<li>재사용성, 구현속도, 코드가독성 높음</li>
</ul>
<ol start="2">
<li>MVVM패턴</li>
</ol>
<ul>
<li>화면 UI코드와 백엔드 데이터 처리 코드를 분리함</li>
<li>리액트와 앵귤러의 장점을 흡수</li>
</ul>
<h3 id="3-뷰-cdn">3. 뷰 CDN</h3>
<p>Vue CDN : <a href="https://v2.vuejs.org/v2/guide/">https://v2.vuejs.org/v2/guide/</a></p>
<ol>
<li>development ver → 개발자도구 vue탭에서 확인 가능<pre><code>&lt;!-- development version, includes helpful console warnings --&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js&quot;&gt;&lt;/script&gt;</code></pre></li>
<li>production ver → 배포용으로 개발자도구에서 볼 수 없음<pre><code>&lt;!-- production version, optimized for size and speed --&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2&quot;&gt;&lt;/script&gt;</code></pre><h3 id="4-vue-실습">4. Vue 실습</h3>
<h4 id="vue-데이터">Vue 데이터</h4>
</li>
</ol>
<ul>
<li>props: [] // (변수) 템플릿에서 활용되는 키워드들, 부모에서 자식으로 내려감</li>
<li>data() { }// (변수) 리턴해서 활용<h4 id="vue-컴포넌트-요소">Vue 컴포넌트 요소</h4>
</li>
<li>el: // element의 약자, html DOM요소 의미</li>
<li>template: `` // 마크업 뷰 템플릿 인스턴스</li>
<li>components: {} // template와 script에서  import한 요소들<h4 id="vue-api">Vue API</h4>
</li>
<li><strong>methods</strong>: {} // 호출에만 실행</li>
<li><strong>computed</strong>: {} // 데이터 값이 바뀔 때마다 실행, 선언형</li>
<li><strong>watch</strong>: {} // (비동기식) 명령형<h4 id="vue-directives-디렉티브">Vue Directives 디렉티브</h4>
v-접두사가 가지는 속성<ul>
<li>v-if : if문</li>
<li>v-bind : 데이터 속성과 html 연결</li>
<li>v-on : 화면 요소의 이벤트 감지</li>
<li>v-model : 인스턴스 데이터와 동기화 (부모-자식 양방향)<h4 id="이벤트-전달">이벤트 전달</h4>
this.$emit : 부모로 이벤트 전달</li>
</ul>
</li>
</ul>
<h4 id="활용">활용</h4>
<pre><code>// Event.preventDefault() 활용하지 않고 .prevent로 바로 처리
&lt;form v-on:submit.prevent=&quot;submitForm()&quot;&gt;</code></pre><h4 id="스니펫">스니펫</h4>
<p><strong>vim</strong> → import New from &#39;@/components/New.vue&#39;;
<strong>vda</strong> →</p>
<pre><code>data() {
  return {
    key: value
  }
},</code></pre><p><strong>vue</strong> → vue 구조 자동완성</p>
<pre><code>&lt;template&gt; &lt;/template&gt;

&lt;script&gt;
export default { }
&lt;/script&gt;

&lt;style&gt; &lt;/style&gt;</code></pre><h3 id="5-메모--기타-알게-된-내용">5. 메모 : 기타 알게 된 내용</h3>
<p><strong>스니펫 snippet</strong> : 사용자의 루틴화를 도와주는, 반복을 줄여주는 것, 자동완성이나 단축키 등</p>
<ul>
<li>Code &gt; Preferences &gt; User snippets</li>
<li>javascript react</li>
</ul>
<p><strong>에밋 Emmet</strong> : HTML, CSS의 작성 시간을 줄이는 자동완성 기능</p>
<ul>
<li>!만 쳐도 html 구조가 바로 생성된다</li>
<li>[HTML]Emmet 사용법 : <a href="https://nachwon.github.io/How_to_use_emmet/">https://nachwon.github.io/How_to_use_emmet/</a></li>
<li>Emmet 예시 : <a href="https://jeonghakhur.gitbooks.io/sublime-text3/content/package-emmet.html">https://jeonghakhur.gitbooks.io/sublime-text3/content/package-emmet.html</a></li>
</ul>
<p>nvm (Node Version Manager): Node.js 버전 매니저</p>
<p>CLI : Command line interface</p>
<p><strong>바벨 Babel</strong> : js개발환경에 구애받지 않도록 하는 컴파일 또는 프랜스파일러 ex) ES6 문법으로 작성한 것을 ES5로 </p>
<p><strong>웹팩 webpack</strong> : 웹 복잡성에 대응하는 모듈화 방식</p>
<ul>
<li>node.js 환경 필요</li>
<li>export, module, loader 등의 키워드를 활용하고 package.json 사용</li>
<li>웹팩 핸드북 : <a href="https://joshua1988.github.io/webpack-guide/">https://joshua1988.github.io/webpack-guide/</a></li>
</ul>
<p>Reset css : 브라우저마다 기본 스타일이 달라서 정리하는 세팅 코드 <a href="https://abcdqbbq.tistory.com/9">https://abcdqbbq.tistory.com/9</a></p>
<h1 id="vue를-접한-소감">Vue를 접한 소감</h1>
<p>React 강의 마지막에 짤막한 Vue 수업이 있어서 비교할 겸 듣게 되었다.
전반적인 소감은 굉장히 간단하고 쉽다는 것이다.
template - script - style으로 이루어진 구조가 한 눈에 보기 편했다.
<del>정리하려고 다시 찾아보니 생각보다 복잡했다</del></p>
<h4 id="오랜만에-공부한-소감">오랜만에 공부한 소감</h4>
<p>구글 독스에 혼자서만 노트용으로 대충 작성하다가 처음으로 외부에 공유하려니 생각보다 부담스럽다.
너무 쉬운 개념도 몰라서 부끄러운 부분도 있었는데 나만 그런 것은 아니리라.. 지금이 중요한 것이 아니라 성장이 중요한 것이다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[(작성중) [룬샷] 현상으로 보는 비즈니스]]></title>
            <link>https://velog.io/@teo_ryu/%EB%A3%AC%EC%83%B7-%ED%98%84%EC%83%81%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%8A%94-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4</link>
            <guid>https://velog.io/@teo_ryu/%EB%A3%AC%EC%83%B7-%ED%98%84%EC%83%81%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%8A%94-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4</guid>
            <pubDate>Sat, 04 Jun 2022 15:29:47 GMT</pubDate>
            <description><![CDATA[<h4 id="밀러의-신약">밀러의 신약</h4>
<blockquote>
<p>밀러의 약은 살짝 들러붙는 정도가 아니었다. 그의 약은 피라나였다. 엉뚱한 단백질에 들러붙는다면 치명적일 수 있었다. 수많은 이들이 겨우 몇 달밖에 남지 않은 시한부 인생을 산다. 이런 맥락을 고려한다면 피라냐의 위험성을 정당화할 수 있었다. 
ㅤ 
몇 달 뒤 밀러의 회사 파머사이클릭스는 이 약의 아이디어를 조롱했던 어느 대형 제약회사에 인수되었다. 인수 가격은 210억 달러였다.
-20p</p>
</blockquote>
<h4 id="노키아의-몰락">노키아의 몰락</h4>
<blockquote>
<p>1970년대에 노키아는 주로 화장지로 유명한 대기업이었다. 이후 20년간 노키아는 최초 카폰, 무선전화 시장을 개척했다. 2000년대 초반까지 노키아는 지구상 스마트폰의 절반을 팔아 치우며 유럽에서 가장 가치 있는 기업이 됐다. 노키아의 CEO는 조직 문화가 성공의 핵심 열쇠라고 설명했다. &quot;좀 재미나게 일해도 되고, 정도에서 벗어나는 생각을 해도 되고... 실수를 해도 되는 거죠.&quot;
ㅤ 
2004년 신이 난 노키아의 엔지니어 몇몇이 완전히 새로운 종류의 전화기를 만들었다. 인터넷이 가능하고 커다란 컬러 터치스크린에 고해상도 카메라가 달린 전화기었다. 엔지니어들은 이 전화기에 어울리는 미친 아이디어를 하나 더 제안했다. 바로 &#39;온라인 앱스토어&#39;를 만들자는 것이었다. 기업의 지도부는 두 가지 아이디어를 모두 깔끔히 묻어버렸다.
ㅤ 
3년 뒤 엔지니어들은 자신들의 미친 아이디어가 샌프란시스코를 무대로 구체화되는 것을 목격했다. 애플의 스티브 잡스가 아이폰을 공개한 것이다. 2013년 노키아는 모바일 사업 부문을 매각했다.
-27p</p>
</blockquote>
<blockquote>
<p>창의성이 중요한 모든 분야에서 우리는 전설의 팀들이 어느 날 갑자기 묘하게 변질되는 것을 본다.
-28p</p>
</blockquote>
<h4 id="레이더-시스템">레이더 시스템</h4>
<p>1922년 해군항공기지에서 아마추어 무선통신 애호가 두 명이 고주파 전파를 이용해 해상에서 배들이 통신할 수 있는 방법을 실험하다가 전파 간섭을 경험한다. 통신 장비를 테스트하다가 우연히 &#39;탐지 장비&#39;를 발견한 것이다. 안개나 어둠, 연막에 관계없이 탐지할 수 있다고 해군에 제안했으나 해군은 이 제안을 무시한다.
그러다 둘은 30년대에 활주로에서 일을 돕다가 비슷한 현상을 경험하고 적군 항공기에 대비한 조기 경보 시스템을 제안하였으나, 이 역시도 자금 지원 요청을 무시당하게 된다.</p>
<blockquote>
<p>행운은 설계의 흔적이다 -75p</p>
</blockquote>
<h2 id="룬샷-vs-프렌차이즈">룬샷 VS 프렌차이즈</h2>
<p>룬샷과 프렌차이즈는 저자가 구분한 두 가지 조직 타입이다.
룬샷 ↔    프렌차이즈
예술가    ↔    병사
발명가    ↔ 운영자</p>
<p>제목과 처음 도입부만 읽는다면 룬샷에 집중해야할 것처럼 느끼지만 저자는 한 조직만을 편애해서는 안된다고 말한다. 한 쪽을 추구하다보면 양쪽의 그룹 사이에서 적대감이 형성되거나 소통하지 않게 되기 때문이다. 룬샷만을 추구하다보면 잡스가 쫓겨날 당시의 애플처럼 시장에서 상업적으로 완전히 실패할 수 있다.</p>
<blockquote>
<p>포스트잇과 스카치테이프를 발명했던 3M이 2000년대에 식스시그마의 열혈 전도사를 새 CEO로 들이자, 혁신은 곤두박질쳤다. 이런 상황은 그 사람이 떠나고 새로 부임한 CEO가 옛 시스템을 복원한 후에도 한참이 지나서야 회복 될 수 있었다. 새로 부임한 CEO는 효율주의 시스템을 실수라고 설명했다. &quot;할당된 발명 개수를 채우지 못했으니 수요일에 좋은 아이디어 세 개, 금요일에 좋은 아이디어 두 개를 생각해내야겠어...라고 할 수는 없는 노릇이죠. - 82p</p>
</blockquote>
<blockquote>
<p>버니바 부시는 스스로도 뛰어난 발명가이자 엔지니어였으나 룬샷의 세부 사항에 대해서는 일절 관여하지 않는다는 원칙을 칼같이 지켰다. &quot;내가 갖고 있는 아이디어를 구현한 적은 한 번도 없었다.&quot;
 베일 역시 기술프로그램의 상세한 부분에는 관여하지 않았다. 본인들의 할 일은 룬샷과 프랜차이즈 사이의 균형과 소통을 관리하는 것이라고 생각했다. -85p</p>
</blockquote>
<h2 id="정신-·-사람-·-시간">정신 · 사람 · 시간</h2>
<p> 정신 : 우리가 계속 움직일 수 있게 하는 목적, 이유
 사람 : 가장 등한시하기 쉬운 것, 가장 중요한 것.
 시간 : 생각 없이 채워나가게 되는, 그러나 가장 귀중한 자원.</p>
<p> <img src="https://velog.velcdn.com/images/teo_ryu/post/cadf90a9-06b5-4020-aa21-38c19a7a81c4/image.png" alt=""></p>
<p> 앞부분은 어느 정도 읽었던 내용들인데도, 오랜만에 독서하는 데 이렇게 재미를 느낀 적이 있었나? 중간에 잡생각과 혼란이 있었지만, 회사 상황과도 비슷해서 아주 아주 많이 몰입되었다. 
이제 규칙적으로 독서 시간을 정해서 남은 부분을 읽을 예정</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[독서의 시작, 삶의 전환]]></title>
            <link>https://velog.io/@teo_ryu/%EB%8F%85%EC%84%9C%EC%9D%98-%EC%8B%9C%EC%9E%91-%EC%82%B6%EC%9D%98-%EC%A0%84%ED%99%98</link>
            <guid>https://velog.io/@teo_ryu/%EB%8F%85%EC%84%9C%EC%9D%98-%EC%8B%9C%EC%9E%91-%EC%82%B6%EC%9D%98-%EC%A0%84%ED%99%98</guid>
            <pubDate>Sat, 04 Jun 2022 14:34:22 GMT</pubDate>
            <description><![CDATA[<h3 id="변화를-사랑한다">변화를 사랑한다.</h3>
<p>나는 변화를 좋아한다. 탈바꿈하는 것. 지인이든 연예인이든 새롭게 확 변환 모습으로 등장했을 때를 참 좋아한다. 항상 똑같은 모습으로 있는 건 지루하고 뻔하게 느껴진다.</p>
<p>사실 사람은 크게 달라지지 않기 때문에 더더욱 내 스스로가 임의로 변화점을 정하고 변했다고 느끼려고 하는 것 같다. 바로 지금 순간이 또 하나의 전환점이 되는 시기인데, 그에 맞추어서 내 삶을 새롭게 개편하려고 한다.</p>
<h3 id="습관화한다는-것-삶의-일부가-된다는-것">습관화한다는 것, 삶의 일부가 된다는 것</h3>
<p>그 방법의 하나로 [독서]를 습관화하는 것인데, &#39;습관화&#39;라고하는 것은 어떤 의지의 차원이라기보다 앞으로의 삶에서 나의 일부로 가져가겠다는 &#39;인정&#39;의 개념에 더 가까울 것이다. </p>
<p>그런 측면에서 내가 해냈던 것이 바로 [운동]과 [개발]이다. 이 분야에서 높은 위치에 올라가 있는 사람들이 보기에는 아주 귀여운 수준이겠지만, 습관화에서 성공한 것들로 [독서]를 성공시키려는 상황에서도 근거있는 자신감을 주고 있기도 하다. 이런 식으로 또 한 가지를 습관화한다면 다음 번에 무언가를 가져가려고 할 때도 자신감을 줄 것이라 생각한다. 
억지로 어떤 기록이나 활동을 하는 것이 중요한 것이 아니라, 내 스스로 이것들이 나의 삶의 일부분이고 앞으로도 멀어질 일 없는 요소라고 생각하는 태도가 자리잡는 것이 중요하다고 생각한다. 독서는 이제 막 시작이다.</p>
<h3 id="독서를-하려는-이유--나를-달라지게-하기">독서를 하려는 이유 : 나를 달라지게 하기</h3>
<p><strong>1) 어떤 정보를 취함에 있어서 너무나 단편적으로 즉흥적으로만 하고 있다는 생각이 들어서이다.</strong> 
인터넷 커뮤니티, 기사, 주변 지인들의 이야기 등 자극적이고 가십거리인 이야기들로만 머리를 채우고 있기 때문이다. 
계속 성장하면서 살아가야겠다는 것이 삶의 모토인데, 나의 뇌와 나의 사고는 어느 순간 멈춰가고 있는 것처럼 느껴졌다.</p>
<p><strong>2) 생활 속에서 비어있는 부분들을 쓸데없는 행위들로 채우고 있었다.</strong> 
&lt;게임 + 커뮤니티 + 예능 + 불필요한 컨텐츠&gt; 이런 것들로 시간을 채우고 있었기 때문에 어느 정도는 편하고 재미있게 느껴졌겠지만, 한편으로는 점점 스트레스를 받고 있었다. 나의 생활이 너무 엉망으로 느껴졌기 때문이다.</p>
<p>그리고 그 툴로써 블로그에 독서 기록을 남겨보려고 한다.
짧아도 습관화.
화이팅.</p>
]]></description>
        </item>
    </channel>
</rss>