<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>deathsizes_86.log</title>
        <link>https://velog.io/</link>
        <description>새로운 기술, 새로운 운동을 탐구합니다. </description>
        <lastBuildDate>Wed, 23 Mar 2022 06:13:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>deathsizes_86.log</title>
            <url>https://images.velog.io/images/deathsizes_86/profile/0828e8f7-3cde-41fa-92d6-94b51464fc5e/스크린샷 2021-11-08 오후 8.55.23.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. deathsizes_86.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/deathsizes_86" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[how to googling]]></title>
            <link>https://velog.io/@deathsizes_86/how-to-googling</link>
            <guid>https://velog.io/@deathsizes_86/how-to-googling</guid>
            <pubDate>Wed, 23 Mar 2022 06:13:57 GMT</pubDate>
            <description><![CDATA[<h2 id="how-to-googling">how to googling</h2>
<p>implement /drag and drop html/ react
<strong>구현 구현기능 스택</strong></p>
<h2 id="검색-정확도-높히기">검색 정확도 높히기</h2>
<p>특정 문장 검색 정확도 높히기는 &quot;&quot;
&quot;be of the web&quot;</p>
<h2 id="stack-제외하기">stack 제외하기</h2>
<p>store javascript date object in mysql -php</p>
<h2 id="스택오버플로우에서-검색하기-혹은-다른">스택오버플로우에서 검색하기 (혹은 다른)</h2>
<p>site:stackoverflow.com detect click outside element in</p>
<h2 id="기간특정-필터링">기간특정 (필터링)</h2>
<p>before:2020
after:2020</p>
<p>출처 : 엘리의드림코딩 유튜브 채널</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Blockchain]]></title>
            <link>https://velog.io/@deathsizes_86/Blockchain</link>
            <guid>https://velog.io/@deathsizes_86/Blockchain</guid>
            <pubDate>Thu, 09 Dec 2021 08:25:22 GMT</pubDate>
            <description><![CDATA[<h1 id="what-is-block-chain">what is block chain</h1>
<h3 id="blockdatabase--chain">Block(database) + chain</h3>
<h4 id="feature">feature</h4>
<p>Only add or input
Decentralization (don’t    access)
onewayfunction
Prevhash + myhash    </p>
<p>Nounce = hash 정보중에 일부를 miner가 유일하게 바꿀 수 있는 정보이며 해당 정보에 맞춰 블록을 추가하거나 추가하고자 하는 블록의 검수가 가능. </p>
<ul>
<li>블록 추가는 어렵지만 검수는 금방 할 수 있음 </li>
<li>비트코인의 경우 10분 간격으로 코인추가가 가능 </li>
<li>비트코인의 경우 nounce가 19개의 0으로 hash가 구성되어 있다 (추가 어려운점)</li>
</ul>
<h3 id="smart-contract">Smart contract</h3>
<p>위 시스템을 이용해서 결제 시스템이나, iot연결을 이용한 다양한 서비스 구축이 가능. 
그리고 개발자의 코드를 컨트랙에 저장하는 경우 블록체인시스템에 의해서 모두 카피본을 공유하고 있어 서버 하나가 죽는다고 데이터가 전부 유실되는 경우가 거의 없음. 
단점 
Trustful기반으로 외부 소스를 사용할 수 있는데 외부기기를 사용할때 신뢰기반으로 
작동되기 떄문에 외부기기가 외부에 노출되는 경우 보안에 취약한 것이 치명적 단점 </p>
<h3 id="nft">NFT</h3>
<p>Non fundableToken</p>
<p>Smart contract 에 1개의 토큰이 발행되는데 이 토큰대신 그림이미지를 넣게 된다. 
그러니깐 어떤 작품이 들어간다고 하면 이미지 하나만 들어가는 꼴이 되는데 
이 자체가 가치가 올라가는 이유는 블록체인에 1개당 1개의 인증서가 발행될 수 있기 떄문 이를테면 이미지가 하나 있는 경우 원작자의 사인이나 원작자가 원본임을 증명할 수 있는 어떤 것들을 넣을 수 있어 가치가 상승하는 것. 
이를테면 유명인의 트위터 글 하나나 인스타그램 포스팅 사진 이미지를 nft로서 발행 가능하고 실제 발행하여 비싼 금액에 판매됨 
최초의 온라인 자산으로 의미가 높기도 함 </p>
<h3 id="encrypted-wallet">Encrypted wallet</h3>
<p>Bitcoin sending
Asymmetric encryption
총 4개의 키가 있다. A에게 private, public B에게 private, public 
해서 각자 사용할 수 있도록 주고 받고 하면서 사용하는 방식 이것이 wallet이다. </p>
<h2 id="그외-기타-용어-정리">그외 기타 용어 정리</h2>
<h3 id="defi">DEFI</h3>
<p>Decentralized Finance 
No third party (중간관리자나 감시자 )
중간 역할은 sma
Smart contract powered bank
Stable coin (busd)
Is one use is one coin that meaning is stable </p>
<h3 id="aave-smart-contract">AAVE (smart contract)</h3>
<p>Something like bank </p>
<h3 id="dex">DEX</h3>
<p>Decentralized Exchanges
There is service kind of gamble for example who will be winner between somebody </p>
<p>Ex ) bithum is centralized Exchange
Require pull </p>
<p>Busd eth is coin </p>
<h4 id="현재-사용중인-대표적인-언어들">현재 사용중인 대표적인 언어들</h4>
<p>Ethurium 
Go lang</p>
<p>BTC have not bank bank is consumer 
No private</p>
<p>Proof stake
Reducing consuming 
And safety </p>
<h4 id="cosmos-using-go">Cosmos (using go)</h4>
<p>Interactive with blockchain each other</p>
<h4 id="polkadot-using-rust">Polkadot (using Rust)</h4>
<p>Similar to cosmos 
Not yet having a big project</p>
<p>Opensea - nftmarket </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React_함수형 프로그램]]></title>
            <link>https://velog.io/@deathsizes_86/React%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8</link>
            <guid>https://velog.io/@deathsizes_86/React%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8</guid>
            <pubDate>Thu, 09 Dec 2021 08:17:22 GMT</pubDate>
            <description><![CDATA[<h2 id="함수형-리액트">함수형 리액트</h2>
<p>Class 형에서 함수형 프로그램을 요즘은 더 많이 쓰고 있다. 
그이유는 코드상으로 좀더 간결하게 사용이 가능하고 hook이 도입되어 state를 통한 데이터 관리와 이전에는 클래스에서만 가능 하던 것들이<br>많은 hook의 등장으로 클래스와 동등하게 사용이 가능하게 되었다. 
디자이너와 협업시기에도 코드를 이해하기 좋고, 개발자들끼리도 코드의 가독성이 좋아 각광받고 있는 추세이다.</p>
<h3 id="사용이-간편한-대표적인-hook들">사용이 간편한 대표적인 hook들</h3>
<h4 id="usestate">useState</h4>
<p>클래스의 경우 state={count: 0}과 같이 이용하여 데이터를 관리한다고 했을 떄 </p>
<pre><code>useState 의 경우 const = [count, setCount] = useState(초기값)</code></pre><p>과 같이 useState 내부에 데이터 관리가 이행된다. 
하여 데이터를 수정할떄 class에 정의하는 아래의 정의방식을</p>
<pre><code>this.setState=({count: this.state.count + 1})</code></pre><p><strong>setCount=({count})</strong> 로 아주 간략히 설정하는 것만으로 데이터 관리가 가능해진다.  </p>
<h4 id="useref">useRef</h4>
<p>useState를 사용하여 컴퍼넌트를 관리하는 경우 불필요한 리랜더링이 발생하게 된다. 
이부분을 보완하기 위해서 사용할 수 있는 훅으로 입력 받는 태그에 ref={spanRef}
Const spanRef = useRef{} 를 각각 작성하여 useRef자체의 메모리에 저장하고 관리하여 리랙더링의 빈도수를 낮출 수 있다. </p>
<h4 id="usecallback">useCallback</h4>
<p>위의 useRef 방법에서 추가적으로 불필요한 데이터 리랜더링을 줄이기 위한 방법으로 
버튼에 연결되는 함수를 작동시키는 곳에 적용하여 함수를 누를떄마다 함수가 생성되서 작동되지 않고 useCallback 메모리 내에서 함수를 저장하고 관리하여 리랜더링 빈도수를 역시 줄여주게 된다. </p>
<h4 id="useeffect">UseEffect</h4>
<p>useEffect의 경우 어플리케이션의 컴퍼넌트가 실행될때마다 작동되는 특징이 있는데 
useEffect =(()=&gt;{},[statedata]);
위에처럼 입력하는 경우 statedata 가 업데이트 될떄만 실행이되고, []단순 공란으로 두는 경우 처음에만 실행되고 이후에는 실행되지 않는 특징이 있다. 
그래서 최초 기동시에 발생하는 로그인이나 어플리케이션의 로딩과 같은 경우 사용하는 경우들이 있다. </p>
<h4 id="spread-operator">Spread Operator</h4>
<ul>
<li>Spread Operator는 Shallow-cloning을 합니다. 🚨
배열안에 있는 모든 오브젝트 또 그 안에 들어 있을 수 있는 오브젝트들까지 모두 다 한땀 한땀씩 새로운 것으로 바꿔 주는것이 아니라, 단순히 제일 상위의 배열 껍데기만 새로운 껍데기로 바꿔주고 안의 오브젝트는 예전의 그 것을 참조값을 복사해 와요.
Spread Operator를 이용하면 처음에는 안에 들어 있는 내용물들을 복사해 오지만 (값이 아니라 레퍼런스, 참조값만 복사해 오죠!) 
배열 자체는 새로운 것을 만들기 때문에 배열에 아이템을 삭제 하거나, 추가 하면 배열의 내용은 달라질 수 있어요.</li>
</ul>
<h4 id="state를-직접-변경하면-안되는-이유">state를 직접 변경하면 안되는 이유</h4>
<p>기본적으로 프로그래밍에서는 오브젝트를 직접적으로 수정하는 것 자체가 좋지 않다. 
그곳에서 오류가 발생할 가는성이 있기때문에 오브젝트는 Immutability 를 유지시켜줘야하는 것이 원칙이다. 
그런 원칙적인 부분과 </p>
<p>첫번쨰로 <strong>setState는 비동기적</strong>으로 움직이는 메써드 이기때문에 직접적으로 수정되어 버리는 경우 업데이트되는 과정에 오류가 발생할 확률이 높아진다. 
두번쨰는 <strong>Purecomponent 나 memo</strong>를 사용하는 경우 변경된 데이터로 레퍼런스를 참고하고 업데이트 하려는 과정에서 데이터값이 변경되지 않은 것으로 생각하여 업데이트를 안하게 된다. </p>
<p>*<em>Prop 전달할떄 tip *</em>
데이터 사용시 Props.video.가 반복되는경우  프롭을 (props)대신 ({video})로 사용하거나 ({video: items}) 비디오를 아이템스로 바꿔서 사용할 수 있도록 
설정이 가능하다. 
비디오 안에 있는 것을 쓰고자 한다고 할떄는 ({video: {snippet}})과 같이 정의할 수 있다. </p>
<p>Component 전체적인 것을 스타일링 할떄는 div태그로 감싸고 그 위에 해야한다. </p>
<pre><code>Deleted &amp;&amp; &lt;component&gt;</code></pre><p>와 같은 구문을 쓸떄 
스타일링이 꼬이지 않게 하려면 </p>
<pre><code>selected &amp;&amp; &lt;&gt;&lt;component/&gt;&lt;&gt;</code></pre><p>와 같은 형태로 해줘야한다. 
**위와 같은 오류는 컴퍼넌트를 사용하면서 의외로 많이 나타나는 현상으로 주의해야한다. (어짜피 오류뜨면 바로 수정하면 별일 없기는 하다.)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[About component_React]]></title>
            <link>https://velog.io/@deathsizes_86/AboutcomponentReact</link>
            <guid>https://velog.io/@deathsizes_86/AboutcomponentReact</guid>
            <pubDate>Thu, 09 Dec 2021 08:11:05 GMT</pubDate>
            <description><![CDATA[<h1 id="what-about-purecomponent">what about purecomponent</h1>
<p>리엑트는 virtual dom 을 사용해서 redering을 사용할 떄 실제로 컴퍼넌트 내부 값이 변하지 않는 이상 모두 데이터를 새롭게 부르지 않는다. 
하지만 특정 컴퍼넌트 값이 변경되는 경우에 렌더링시 자동으로 호출되는 componentdidUpdate() 가 불필요하게 자동실행되는데 이렇게 되면 크게 느리게 되지는 않으나 깜빰임과 같은 불편함으로 
성능개선이 필요한 시점이 온게된다. 
이런부분의 오류를 크롬 리액트 툴을 이용해서 컴퍼넌트 업데이트 상태창을 검색해서 확인할 수 있고 이 부분은 리엑트의 메모나 purecomponent 를 사용해서 개선할 수 있다. 
퓨어 컴퍼넌트에 대한 공식 문서는 아래와 같다 </p>
<p><a href="https://reactjs.org/docs/react-api.html#reactpurecomponent">https://reactjs.org/docs/react-api.html#reactpurecomponent</a></p>
<h2 id="purecomponent">PureComponent</h2>
<p>퓨어컴퍼넌트는 공식문서에 적혀있지만 간략히 요약설명하면 <strong>shallow comparison</strong> 으로 간단 설명이 가능할 거 같다. 구체적으로 설명하면 가장 자식이 되는 컴퍼넌트에서 이벤트가 발생할떄 해당 자식이 되는 state 값이나 혹은 prop 값의 오브젝트가 변경이 되었는지 깊히 체크 하는 것을 말하는데  component를 purecomponent로 이름을 바꿔주는 것만으로 오브젝트를 검사해서 빈번한 리랜더링이 발생되는 것을 막아준다. 
하지만 
퓨어 컴퍼넌트를 사용시 예를 들면</p>
<pre><code>HandleReset () =&gt; {
const habits = this.state.habits.map( habit =&gt; {habit.count = 0; 
return habit})
setState({habits}) }</code></pre><p>위의 코드로 되어 있는 경우 habit.count 값이 변경이 되는 경우 해당 오브젝트는 같은 값으로 취급하여 변경사항을 리랜더링 되지 않아 업데이트가 안되는 현상이 발생하는 경우가 있다. 
위 부분을 해결 할 수 있는 방법은 스프레드오퍼레이터를 사용하여 클로닝 된 오브젝트로 변경된 값을 비교 업데이트 하는 경우 리엑트가 shallow comparison을 실행하여도 변경된 값을 식별하는 것이 가능하게 된다. 
예시 코드는 아래와 같다.  포인트는 <strong>{…habit, count: 0}</strong> 다.</p>
<pre><code>HandleReset () =&gt; {
const habits = this.state.habits.map( habit =&gt; 
 { if(habit.count !== 0){ return{…habit, count: 0}; }return habit;})
setState({habits}) }
</code></pre><h4 id="lifecycle-메써드">Lifecycle 메써드</h4>
<p><strong>componentDidMount(){}
componentWillMount(){}</strong>
위에 메써드가 리엑트에 내장이 되어있는데, 각각 컴퍼넌트 작동하는 상황에 따라 자동으로 호출시키는 라이프사이클 메써드이다. 
상황에 따라 여러라이프 사이클 메써드가 있는데, 어플리케이션이 제대로 작동하는 지 여부를 아래 함수를 입력하고 console.log를 사용하여 디테일한 오류를 캐치하는데 사용이 가능하다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[PostCSS]]></title>
            <link>https://velog.io/@deathsizes_86/PostCSS</link>
            <guid>https://velog.io/@deathsizes_86/PostCSS</guid>
            <pubDate>Thu, 09 Dec 2021 07:17:01 GMT</pubDate>
            <description><![CDATA[<h1 id="what-is-postcss">what is postcss</h1>
<p><a href="https://postcss.org/">postCss 공식문서</a>
공식문서를 보면 설명되어 있지만, 포스트css는 리엑트에서 사용가능한 패키지로 상당히 다양한 플러그인을 보유하고 있으며, 점점 사용범위 사용량이 늘고 있는 아주 인기 있는 툴이다. </p>
<h3 id="특장점">특장점</h3>
<p><strong>1.</strong>Less, Sass 
를 기존 혹은 현재도 많이 사용하고 있으나, 위 도구들은 
별도의 문법을 공부하고 사용해야 하는 단점이 있다.
postcss는 기존 css 문법의 틀을 크게 벗어나지 않은채로 사용하게 되어 더욱 각광 받고 있는 점이 첫번쨰
<strong>2.autoprefixer</strong>
두번쨰로는 위에 내장된 오토프리픽서 덕분에 webkit과 같은 브라우저간의 호환성 비율을 별도로 정의하지 않고 자동으로 지정하게 되어 편리한 것이 두번쨰
<strong>3.Module</strong>
각 컴퍼넌트에 맞춰 모듈화된 것을 끌어다 사용하기 떄문에 naming으로 구분지어 정의하지 않아도 간편한 장점이 있다. </p>
<p>PostCSS Plugins: <a href="https://www.postcss.parts/">https://www.postcss.parts/</a>
Plugins Github 페이지: <a href="https://github.com/postcss/postcss/blob/master/docs/plugins.md">https://github.com/postcss/postcss/blob/master/docs/plugins.md</a></p>
<h3 id="how-to-use">how to use</h3>
<p>리엑트 패키지를 설치할떄 사용빈도가 높은 툴은 기본값으로 설치되게 되는데 포스트css는 보면 자동으로 설치가 되도록 정의되있다. 
만약에 설치되지 않는 경우는 공식문서를 참조하도록 하자. 하지만 기본값으로 설정되어 있어 설치되는 것이 일반적이다. </p>
<h4 id="컴퍼넌트-폴더-구축">컴퍼넌트 폴더 구축</h4>
<p>components/componentnamefolder
위와같이 폴더를 생성하여 해당 폴더에 <strong>component.jsx</strong>
<strong>component.module.css</strong>
두가지를 생성하여 컴퍼넌트에 정의시기에 상단에 </p>
<pre><code>import styles from &#39;./header.module.css&#39;;</code></pre><p>위와 같이 임포트 해준다. </p>
<pre><code> &lt;header className={styles.header}&gt;</code></pre><p>그리고 정의는 위와같이 하며, css파일에 </p>
<pre><code>.header {margin: 20px}</code></pre><p>예문과 같이 하나씩 정의하면서 정리하면된다. </p>
<p>예문에서 볼 수 있듯 이렇게 정리하면 중복되는 이름에 있어 구애받을 필요가 없게되며 각 폴더별로 구분되어 있어 추 후 수정사항이 있을떄 가독성도 좋아 편리하다. 
많은 개발자들이 사용하는데에는 다 이유가 있다. ^^ </p>
<h4 id="그외-기타사용">그외 기타사용</h4>
<p>React에서 제일 상위 파일 즉 컨텐츠 전체를 가운데 정렬 하고자 할때는 
Index.css 에서 #root{display: flex; justify-content: center;}
로 지정해주면 된다. </p>
<pre><code>&lt;pre&gt;</code></pre><p>위 태그의 경우 별도의 정의가 없다면 파라그래프가 줄바뀜 없이 쭉 아래로 내려가지는 것을 확인 할 수 있다. 
위 내용을 해결하기 위해서는 {white-space: pre-wrap;}
을 정의해주면 해결된다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[API]]></title>
            <link>https://velog.io/@deathsizes_86/API</link>
            <guid>https://velog.io/@deathsizes_86/API</guid>
            <pubDate>Thu, 09 Dec 2021 06:17:09 GMT</pubDate>
            <description><![CDATA[<h1 id="what-is-restapi">What is RestAPI</h1>
<p>rest api는 위키디피아 혹은 그외에 정리되어진 여러가지 칼럼들이 난무한데
길게 말할 필요없다고 생각한다. 간단히 요약하면 
<strong>Representational state transfer **
프론트와 백엔드 통신을 원할하게 하기위해 정의해놓은 규칙을 이야기 하는 것으로
**Get post put delete</strong> 와 같은 메써드들이 정해져 있다. 
(그외에도 여러가지가 있고, 그외 것들은 논란이 있는 것도 있으나 위의 것들이 대표적이면서 대명사로서 쓰이는 것들)</p>
<h3 id="how-to-use-at-react">How to use at React</h3>
<p>우선 컨텐츠를 보여주기 위해 서버에 있는 내용들을 다운받아 사용하는 것이 일반 적인 것으로 리엑트 에서는 보통 api 적용시 컴퍼넌트가 마운트 될때 한번만 통신 할 수 있도록 </p>
<pre><code>useEffect(()=&gt;{api}, []) </code></pre><p>이렇게 정의한다.  그리고 아래의 예문은 fetch 적용했을 때 postman 으로부터 출력해준 코드 예문이다. </p>
<pre><code>const requestOptions = {
  method: &#39;GET&#39;,
  redirect: &#39;follow&#39;
};

fetch(&quot;https://youtube.googleapis.com/youtube/v3/search?part=snippet&amp;maxResults=25&amp;q=bts&amp;key=AIzaSyA8HgKL9NHSUh2wAhoZyL2KwxjtvAFJoX8&quot;, requestOptions)
  .then(response =&gt; response.text())
  .then(result =&gt; console.log(result))
  .catch(error =&gt; console.log(&#39;error&#39;, error));</code></pre><p>** 위의 response.text는 json() 으로 변경하는 것이 개발툴로 데이터를 열람하기 좋다. 
Json 으로 변경하고 데이터를 보면서 사용하고자 하는 데이터 값을 
리엑트로 생성한 </p>
<pre><code>const [videos, setVideos] = useState([]) </code></pre><p>이곳</p>
<pre><code>Result =&gt; setVideos(result.item) </code></pre><p>usestate로 데이터를 관리하는 곳에 출력하도록 로직을 정리해주는 것이 일반적으로 사용되는 방법이다. </p>
<h2 id="fetch와-axios">Fetch와 axios</h2>
<p>axios가 일반적으로 많이 쓰이고 있는데 
반환되는 response를 json()화 없이 바로 적용 가능하다. 
그리고 주소부분의 가독성이 좋도록 정리하기 좋은 점으로 많이 사용되는 이유중에 하나이다.</p>
<h3 id="중요하면서-기본보안">중요하면서 기본(보안)</h3>
<p>비즈니스 로직의 경우 최대한 로직을 숨기는것이 좋다. 
비즈니스 로직이 담긴 구문을 각 하나의 기능으로 정의하고 
<strong>index.js</strong> 에서 <strong>independency injection</strong> 
(url 정보와 키를 index.js에 정의하고 index에 서비스를 임포트하여 인자로 넘겨 로직을 정리함)으로 처리해주어 코드가 노출되지 않도록 하는 것이 좋다. 
여기에 더 나아가 .env를 생성하여 키와 서버정보를 기록하고 gitignore로 로컬 외에 공간에서는 공유할 수 없도록 설정하는 것이 보안을 위해 꼭 해줘야하 하는 부분이다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[About Go]]></title>
            <link>https://velog.io/@deathsizes_86/About-Go</link>
            <guid>https://velog.io/@deathsizes_86/About-Go</guid>
            <pubDate>Thu, 09 Dec 2021 05:37:02 GMT</pubDate>
            <description><![CDATA[<h1 id="tutorial">Tutorial</h1>
<h3 id="this-is-multi-core">this is Multi core</h3>
<p>우선 go의 환경은 설치 파일을 다운받아 설치를 해줘야한다. 
node 같은 경우 사용자가 임의로 설치장소를 지정하여 끌어다가 사용이 가능하지만 go 언어는 특별히 지정된 장소에서 설치되어있어야 정상 작동하게 되어있다. 
(mac 사용자는 처음 설치시기에 장소를 제대로 지정하지 않는 경우 admin 폴더 공간에 설치되는 경우 개발하면서 터미널에 sudo를 무조건 치면서 해야하는 곤혹을 치룰 수 있다...주의하길 바란다.)</p>
<h2 id="packages-and-import">Packages and Import</h2>
<p>node와는 다르게 package json은 없고 
컴파일 기준이 되는 main.go 파일을 생성해 아래와 같은 패키지 메인 함수를 정의 하거나 외부에 생성한 파일함수에서 import 해야한다. </p>
<pre><code>Package main 

Func main() {}</code></pre><p>함수의 이름을 정의할때 F 와 같은 대문자로 정의하는 경우 <strong>public</strong>으로 자동지정되어 어디서는 자동 import 된다. 
하지만 소문자로 하면 <strong>private</strong>화 되서 자동 import되지 않는 특징이 있다. </p>
<h2 id="variables-and-constants">Variables and Constants</h2>
<pre><code>const name string = “name”
var(사용가능)</code></pre><p>위 변수를 아래와 같이 축약 가능 </p>
<pre><code>name := “name”</code></pre><p>이렇게 작성하는 경우 해당 값이 <strong>string인지는 go가 판단</strong>해서 값을 지정해준다. 
위와 같은 shorthand  문법은 함수 내부에서만 사용가능한 점을 주의할 것</p>
<h2 id="function-작성법">Function 작성법</h2>
<p>위에 변수를 정의할 떄 처럼 역시 argument 정의를 할떄 타입을 정의해야한다. 
그리고 리턴값도 어떤 값으로 정의되는지도 정의해줘야한다. </p>
<pre><code>Func multiply (a int, b int) int{return a + b}</code></pre><p><strong>리턴값 정의</strong></p>
<pre><code>Func lenAndUpper(name string)(int, string)
{return len(name), strings.toUpper(name)}

Func main() 
{totalLenght, uppperName := lenAndUpper(“sean”)
Fat.PrintIn(totalLenght, upperName)}</code></pre><p>** 변수값과 리턴값을 정의하는 방식을 유심히 참고해보자. </p>
<h3 id="naked-return">Naked return</h3>
<p>Return 값을 따로 정의하지 않아도 go 에서 알아서 리턴 가능한 기능. </p>
<h3 id="multiple-return-value">Multiple return value</h3>
<pre><code>func name (arg type)(return){definition}
Func lenAndUpper(name string) (length int, uppercase string) {
Length = len(name)
Uppercase = strings.ToUpper(name)} return </code></pre><p>리턴되는 값을 사전에 (length int, uppercase string) 와 같이 정의하면 
별도로 리턴값을 정의하지 않아도 알아서 값을 출력할 수 있다. </p>
<h3 id="defer">defer</h3>
<pre><code>Func lenAndUpper(name string) (length int, uppercase string) {
Defer fmt.PrintIn(‘done’)
Length = len(name)
Uppercase = strings.ToUpper(name)} return </code></pre><p>위와같이 defer를 함수에 사용하게 되는 경우 해당 함수의 리턴이 완료 된 후에 
defer로 정의된 부분을 마지막으로 실행하게 된다. </p>
<h3 id="반복문">반복문</h3>
<pre><code>Func superAdd(numbers …int) int {
Total := 0
for _, number := range numbers {total += number}return total }</code></pre><p> for _ 는 앞의 값을 무시하고 넘어간다. 
 range는 index값을 만들어주면서 반복으로 사용한다. </p>
<h3 id="조건문">조건문</h3>
<pre><code>func canIDrink(age int) bool {
If age &lt; 18 {return false} return true}</code></pre><p>여기서 else를 작성하면 굳이 필요없다는 안내문과 함께 삭제하게된다. 
*<em>variable expression *</em></p>
<pre><code>func canIDrink(age int) bool {
If koreaAge := age + 2;  koreaAge &lt; 18 
{return false} return true}</code></pre><p>여기서는 조건문 내부에 변수를 따로 정의해서 조건내 추가 조건을 설정할 수 있다. 
다른 언어에는 없는 특징이라 사용하는데 더 요긴하게 쓰일 수 있는 부분이 되겠다. </p>
<pre><code>Pointer    
Func main() {
a := 2
b := &amp;a
*b = 2020
fmt.PrintIn(a)
}</code></pre><p>&amp;는 데이터의 메모리를 지칭할떄 사용하며 
*는 메모리 내부를 흝어볼떄 사용되나 위와 같이 사용하는 경우 
지칭하는 변수의 값을 overiding 할 수 있게 된다. </p>
<h3 id="array-and-slice">Array and slice</h3>
<pre><code>Func main(){
names:= [5]string{“nico”, “lynn”, “dal”}
names[3] = “plus”
fmt.PrintIn(names)}</code></pre><p>배열을 정의할때 [index길이]string(“1”, “2”) 와 같이 정의할 수 있으며, 출력하면 출력을 해주나, 빈 인덱스에 names[3] = “plus” 이와 같이 추가가 가능하다. 
*인덱스를 초과해서 입력하는 경우는 당연히 추가할 수 없다.</p>
<pre><code>Func main(){
names:= []string{“nico”, “lynn”, “dal”}
names = append(names, “plus”)
fmt.PrintIn(names)}</code></pre><p>배열 정의시 아래오 같이 하면, 정의된 내용에 맞게 index가 부여되며 </p>
<pre><code>names:= []string{“nico”, “lynn”, “dal”}</code></pre><p>꽉찬 배열에 내용을 첨부할 때에는 위와 같이 append를 사용해서 추가할 수 있다. </p>
<pre><code>Public private 
package main

import &quot;std/github.com/sean/learngo/banking&quot;

func main() {
    account := banking.Account{Owner: sean, Balance: 00}

}

package banking

// Account struct
type Account struct {
    Owner   string
    Balance int
}</code></pre><p>** 위와 같이 정의된 변수의 이름의 앞에 대문자로 되어있으면, public
소문자로 되어 있는 경우 private이다. 
** 위에 구성한 스트럭쳐를 불러서 사용할 수 있게 하려면 public으로 정의하고 사용해야 해당 스트럭쳐를 임포트 할 수 있는데 이렇게 사용하는 경우 account의 사용자 이름을 임의로 변경하거나 그외의 값을 제3자가 임의로 변경 할 수 있다. </p>
<pre><code>func NewAccount(owner string) *Account {
    account := Account{owner: owner, balance: 0}
    return &amp;account
}</code></pre><p>*위의 내용을 해결하기 위해 데이터를 새롭게 복사하여 생성 할 수 있도록 
포인터를 활용하여 코드를 구성하면 새롭게 생성된 인스턴스에 접근하여 private으로 
안전하게 데이터를 임의로 수정할 수 없도록 하게 할 수 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Postman]]></title>
            <link>https://velog.io/@deathsizes_86/Postman</link>
            <guid>https://velog.io/@deathsizes_86/Postman</guid>
            <pubDate>Thu, 09 Dec 2021 02:03:07 GMT</pubDate>
            <description><![CDATA[<h1 id="what-about-postman">What about postman</h1>
<p>Have you heard about <strong>Collection rich</strong>?
api 부자라고 표현 할 수 있는 표현으로 포스트맨은 각종 퍼블릭 api 나 그 외 다양한 api를 보관하고 관리하면서 필요할떄마다 호출해서 사용하기 편리한 도구이다. 
api 기능별로 설정을 정의하고 호출하는 api를 다운받아 그대로 내 서비스에 적용하여 사능이 가능하여 엄청 편리한 툴로 많이들 사용하고 있다. </p>
<h4 id="추가-방법-authentication-tab">추가 방법 Authentication tab</h4>
<p>Key = key 
Value = 생성된 값 입력 
저장 위치 = 헤더 혹은 바디 
(각 api별 가이드에 따라 다르므로 참조하고 입력)</p>
<h4 id="variable-tab-공통으로-적용된-처음부분의-url-을-변수-정의">Variable tab (공통으로 적용된 처음부분의 url 을 변수 정의)</h4>
<p><strong>Name</strong> : 식별가능한 이름 
<strong>Initial value</strong>: http 다음으로 공통으로 적용되는 url주소를 입력한다. 
그다음 생성이 된경우 api 기능별 request를 추가하면 된다. </p>
<h4 id="기능별-설정-방법">기능별 설정 방법</h4>
<p>상단 url 에 사전에 생성한 url을 불러오기 위해 {{base}} 로 입력한다. 
Ex ) {{base}}/Search**</p>
<p>Url 생성후 아래 쿼리 작성단에 차례대로 작성하여 준다. 
Ex) part(key) snippet(value) 
      maxresult(key) 25(value) </p>
<p>Api 가이드에 적힌대로 모든 주소를 입력한 후에 send를 눌러주면 데이터의 전송여부 상태를 확인할 수 있다. 
** 정보가 정상적으로 기재되면 데이터가 다운되고 안되면 오류가 나올 것이다. </p>
<p>**TIP
오른쪽 상단에 보면 code라는 버튼을 눌렀을 때, 각 언어에 따라 해당 리퀘스트를 
실행할 수 있는 방법이 코드와 기능별로 친절하게 가이드가 펼쳐진다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TDD를 위한 Tool "Jest"]]></title>
            <link>https://velog.io/@deathsizes_86/TDD%EB%A5%BC-%EC%9C%84%ED%95%9C-Tool-Jest</link>
            <guid>https://velog.io/@deathsizes_86/TDD%EB%A5%BC-%EC%9C%84%ED%95%9C-Tool-Jest</guid>
            <pubDate>Thu, 09 Dec 2021 01:45:34 GMT</pubDate>
            <description><![CDATA[<p>코드 테스트를 위하여 개발된 Jest 라는 아주 훌륭한 툴이 있다. 
공식문서는 아래와 같이 확인 가능. 
<a href="https://jestjs.io/">제스트 공식문서</a>
자세한 설치 및 환경 설정 방법은 공식문서 docs에 getting start를 참조하여 하나씩 설치해주면 된다. </p>
<p>여기에 추가적으로 알아두면 좋은 환경 설정의 방법이 있는데
package.json 에서 </p>
<pre><code>Scripts: {test: jest —watch}</code></pre><p>여기에 watch all 을 붙혀주면 실시간으로 결과를 실행하게 되는데
이 상태에서 git ignore 파일을 만들어 </p>
<pre><code>node_modules/*</code></pre><p>을 작성하면 커밋되고 난뒤의 경우 코드들은 자동으로 실행이 되지 않게된다. 
그리고 커밋 전에는 스타트 된 이후 실시간으로 결과값을 송출한다.
(커밋이 됬다는 것은 이미 테스트가 완료되어 커밋되었다는 것이므로) </p>
<h2 id="overview">overview</h2>
<pre><code>const add = require(&#39;../add.js&#39;);

test(&#39;functionName&#39;, ()=&gt;{
    //write a testcode
    expect(add(1,2)).toBe(3);
})</code></pre><p>add.test.js 라는 파일로 테스트하고자 하는 작동함수 이름을 작성하고 expect 나 toBe 와 같은 테스트를 위해 내장된 메써드를 호출하여 기대되는 값과 실제로 나오는 값을 작성하여 준다. </p>
<p>Class 기능테스트 할떄 아래처럼 기능별로 작성이 가능하지만 </p>
<pre><code>Const classname = require(‘../play.js);
test(‘a’, ()=&gt;{})
test(‘b’ ()=&gt;{})</code></pre><p>아래와 같이 describe 클래스로 묶어서 일괄 실행이 가능하다. </p>
<pre><code>describe(&#39;Calculator&#39;, ()=&gt;{
    it(&#39;inits with 0&#39;, ()=&gt;{
        const cal = new Calculator();
        expect(cal, value).toBe(0);
    });
});</code></pre><p>초기화값을 명시하고 it을 통해 클래스에 있는 내용 정의하기</p>
<p>** 클래스 내 함수를 실행할떄 </p>
<pre><code>const cal = new Calculator(); </code></pre><p>이런 오브젝트를 각각 넣어주게 되는데 이렇게 넣게되면 코드중복이 심하다 그렇다고 해서 이것을 일반 자바스크립트 쓰는것과 같이 변수로 정의해서 꺼내서 쓰는 것은 테스트에서 정확성을 기대하는 취지에는 맞지 않으므로 
이 부분은 jest에서 제공하는 함수를 사용하도록 한다.</p>
<pre><code>let = cal;
    beforeEach(()=&gt;{
        cal = new Calculator();
    })</code></pre><p>변수를 처음에 정의하고 해당 오브젝트를 콜백 형태로 넣어줌으로서 이후 오브젝트를 별도로 생성하지 않아도 자동으로 불러와서 실행한다. </p>
<p><strong>클래스 내 한가지 기능에서 여러가지 값을 산출해보고자 할떄는 describe을활용하는 예제문</strong> </p>
<pre><code>describe(&#39;divides&#39;,()=&gt;{
        it(&#39;0/0 = NaN&#39;, ()=&gt;{
            cal.divide(0);
            expect(cal.value).toBe(NaN);
        });
        it(&#39;1/0 = Infinity&#39;, ()=&gt;{
            cal.set(1)
            cal.divide(0);
            expect(cal.value).toBe(Infinity);
        })
    })</code></pre><p><strong>jest —coverage</strong>
위 명령어를 사용하면 jest가 검토가능한 함수들을 전부 확인한다. 에러를 잡는데에는 그에 맞춰 에러 테스트를 별도로 정의하지 않으면 커버할 수 없는 함수라는 적색의 경고점이 뜨게 된다.(오른쪽이 에러가 정의되지 않았을떄 해당 테스트를 커버할 수 없다는 적색 경고문) <img src="https://images.velog.io/images/deathsizes_86/post/2a11d3a4-057b-44ec-a685-fc3287e495bb/%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%202021-12-01%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%209.44.39.png" alt="">
왼쪽은 오류 로직이 정의되어서 오류 여부까지 테스트하여 모든 것을 커버할 수 있다는 올 그린 표시 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[What is the TDD]]></title>
            <link>https://velog.io/@deathsizes_86/What-is-the-TDD</link>
            <guid>https://velog.io/@deathsizes_86/What-is-the-TDD</guid>
            <pubDate>Thu, 09 Dec 2021 00:55:05 GMT</pubDate>
            <description><![CDATA[<h1 id="tdd-test-driven-development">TDD (test driven development)</h1>
<h3 id="what-is-testing">What is testing</h3>
<h3 id="software-testing">Software testing</h3>
<h3 id="quality-bug">Quality, bug</h3>
<p><strong>함수, 기능, ui, 성능, api스펙</strong> 을 test 하여 작동여부를 확인 후 패스하거나 다시 만드는 것을 말합니다.</p>
<p>** 일부회사에서는 검증팀이 따로 있어 코드를 검토했지만, 비효율적인 문제로 자동화 된 추세로 변화되었다. 하지만 이 문제도 개선은 되어도 비효율적인 문제가 있어 개발과 동시에 테스트를 할 수 있도록 시스템이 변모되었다. 
위 개선점에도 불구하고 규모가 있는회사는 qa팀을 별도로 운영하고 있다. </p>
<h3 id="why-software-testreason">Why software test(reason)</h3>
<p>기능 정상 작동 
요구사항 적용
이슈 예측
빠른 버그 수정
리팩토링의 효율성 상승
모듈간 독립적인 코드사용(재사용가능)
코드품질 향상
문서화 가능
시간절약가능</p>
<h3 id="test-pyramid필수테스트">Test pyramid(필수테스트)</h3>
<p>Unit (함수, 모듈, 클래스)
<strong>** 회사마다 쪼개는 단위는 다를 수 있음.</strong> 
Integration(위의 요소의 상호작용)
End to end (ui, 사용자입장의 테스트)</p>
<p>why named pyramid
비용, 시간,  측면(위로 올라갈수록 비용이 올라감)</p>
<h3 id="why-tdd">Why TDD</h3>
<p>TDD는 사전에 기능단위를 최소한으로 작성하는 것을 말하는데
기능단위로 분리해 작성을 하는데 있어 필요한 것들 예를들어
사용자의 입장에 있어서 필요한 사항들, 목표점검, 시스템 전반 에 대하여 정리 점검 후 코드를 작성하기 떄문에 더더욱 각광 받고 있다.
개발자 개인 역량에 따라 하는사람과 않하는 사람이 고 사내 문화적으로도 다르지만 습관적으로 테스트를 하고 협업하는 사람이 아무래도 좋은평가를 받기 좋고, 협업시 불필요한 불협화음 피할 수 있다. </p>
<h3 id="process">Process</h3>
<p>테스트 통과용의 최소한의 코드를 작성 -&gt; 검수 -&gt; 재작성 -&gt; 검수 후 통과 
통과된 코드를 리팩토링 -&gt; 검수 -&gt; 재작성 -&gt; 검수 통과되면 완성</p>
<h3 id="cicd">CI/CD</h3>
<p><strong>(Code build test release deploy)</strong>
the time when I merge deposit에 변경사항을 
주기적으로(테스트코드 포함)확인하고 통합을 하기위한 단계 
(통합시 정상적으로 작동이 되는지, 지금까지 테스트가 이상없는지 )</p>
<p>*<em>위 두가지를 계속 확인하면서 지속적인 배포를 위해 TDD는 중요하다! *</em></p>
<p>Assertion - 조건 비교를 통한 테스트 로직
Test runner - 테스트 실행후 결과 생성</p>
<h3 id="test-종류">TEST 종류</h3>
<p>Unit
Functional<br>Component<br>Unit<br>Contract
Integration    </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리엑트 useState의 setState 사용 팁]]></title>
            <link>https://velog.io/@deathsizes_86/%EB%A6%AC%EC%97%91%ED%8A%B8-useState%EC%9D%98-setState-%EC%82%AC%EC%9A%A9-%ED%8C%81</link>
            <guid>https://velog.io/@deathsizes_86/%EB%A6%AC%EC%97%91%ED%8A%B8-useState%EC%9D%98-setState-%EC%82%AC%EC%9A%A9-%ED%8C%81</guid>
            <pubDate>Sun, 26 Sep 2021 01:08:11 GMT</pubDate>
            <description><![CDATA[<pre><code>const [cards,setCards] = useState()
[]

//변경된 내용을 아래와 같이 사용
setCards(updated)</code></pre><p>위와 같은 사용방법이 일반적으로 setState를 사용할떄 방법이다. 
그런데 간혹 새로운 값을 업데이트 하는 과정에서 새로운 데이터가 업데이트 되지 않는 경우가 있다고 한다.
그것을 대비하기 위해 setCards(callbackFuc) 을 활용하여 사용이 가능하다고 한다. 
예제로 보면 </p>
<pre><code>setCards((cards) =&gt; {
      const updated = { ...cards };
      updated[card.id] = card;
      return;
    });</code></pre><p>위와 같이 활용하는 경우 새로운 데이터가 업데이트 되지 않는 사태는 발생하지 않을것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리엑트 usestate 데이터 오브젝트화]]></title>
            <link>https://velog.io/@deathsizes_86/%EB%A6%AC%EC%97%91%ED%8A%B8-usestate-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8%ED%99%94</link>
            <guid>https://velog.io/@deathsizes_86/%EB%A6%AC%EC%97%91%ED%8A%B8-usestate-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8%ED%99%94</guid>
            <pubDate>Sun, 26 Sep 2021 00:38:17 GMT</pubDate>
            <description><![CDATA[<p>use state를 일반 배열로 자료를 구성하고 반복문을 사용하는 경우 프로그래밍 효율이 좋지 못하다.
이유는 모든 데이터를 일일이 하나씩 조회하고 모든 데이터를 초기화하고 새로 만들기 때문이다.</p>
<p>하지만 이부분을 자바스크립트에 포함된 오브젝트화 특성
(배열의 일부 데이터만 변경해주는 특성)
을 활용하여 프로그래밍 알고리즘을 조금 바꿔준다면 데이터 사용효율이 향상될 수 있는 예제 코드는 아래와 같다.</p>
<pre><code>const [cards, setCards] = useState([{
    id: &#39;1&#39;,
    name: &#39;sean&#39;,
    company: &#39;no&#39;,
    title: &#39;Fengineer&#39;,
    email: &#39;deathsizes@hotmail.com&#39;,
    message: &#39;go got it&#39;,
    fileName: &#39;nothing&#39;,
    fileUrl: &#39;sean.png&#39;,
    theme: &#39;dark&#39;
  }

  //data 받는곳 (혹은 컴퍼넌트)
  {cards.map(card =&gt; (
      &lt;CardEditForm 
      key={card.id} 
      card={card} 
      updateCard={updateCard} 
      deleteCard={deleteCard}/&gt;
    ))}
</code></pre><p>를 1키 와 밸류로 변경 </p>
<pre><code>const [cards, setCards] = useState({&#39;1&#39; : data}, )

//data 받는곳 
{Object.keys(cards).map(key =&gt; (
      &lt;CardEditForm
        key={key}
        card={cards[key]}
        updateCard={updateCard}
        deleteCard={deleteCard}
      /&gt;
    ))}

</code></pre><p>오브젝트 화 하는 것으로 해당하는 키와 벨류값만 변경되는지 조회하여 변경하므로 프로그래밍 작동 효율이 좋아져 성능이 좋아지게 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[about React]]></title>
            <link>https://velog.io/@deathsizes_86/about-React</link>
            <guid>https://velog.io/@deathsizes_86/about-React</guid>
            <pubDate>Mon, 30 Aug 2021 14:32:06 GMT</pubDate>
            <description><![CDATA[<h1 id="프로젝트-구조">프로젝트 구조</h1>
<h3 id="packagejson"><strong>package.json</strong></h3>
<p>npm 버전관리에 대한 정보 (라이브러리포함)
postcss 같은 유용한 패키지들이 자동으로 생성되어 있어 바로 사용가능. </p>
<p>**readme에 프로젝트에 대한 설명을 적기를 권장 </p>
<h3 id="node_modules"><strong>node_modules</strong></h3>
<p>외부라이브러리 추가했을떄 폴더나 파일들이 구조로 생성및 관리되있음
(라이브러리의 이상함을 감지해 내부 구조를 확인할 수 있음)</p>
<h3 id="manifestjson"><strong>manifest.json</strong></h3>
<p>pwa 사용과 관련된 파일</p>
<p>**프로젝트 생성시 깃이 자동으로 생성되게 되있음 (.git)</p>
<h4 id="babel이란">BAbel이란?</h4>
<p>Js,TS -&gt;old JS ver (compiling)</p>
<h4 id="webpack이란">Webpack이란?</h4>
<p>bundling</p>
<h4 id="eslint">Eslint</h4>
<p>Check code</p>
<h4 id="jest">Jest</h4>
<p>unittesting framework</p>
<h4 id="postcss">postCss</h4>
<p>expandable libraries</p>
<h4 id="그외-크롬-툴">그외 크롬 툴</h4>
<p><strong>react developer tool</strong>
리액트로 만든 품목들의 콤퍼넌트를 확인할 수 있다. </p>
<h4 id="그외-vs코드-툴">그외 vs코드 툴</h4>
<p><strong>reactjs code snippets</strong>
rcc ris 같은 단축키만으로, 간단한 스켈레톤 프레임을 생성하는 툴
<strong>auto import</strong>
모듈경로 자동 완성기능</p>
<p>리액트의 virtual dom tree 와 dom tree의 차이 
리엑트의 경우 데이터 일부가 변경된 경우 이전 데이터와 비교하여 수정된 내용만 업데이트 한다. </p>
<p>컴퍼넌트 
class형  라이프사이클 메써드(state)
함수형(React Hook) </p>
<h3 id="class-형-컴퍼넌트를-기피할때의-이유">class 형 컴퍼넌트를 기피할때의 이유</h3>
<p>binding issue 
디자이너들이 보기 어려운 구조
<strong>but</strong>
binding의 경우 여러가지 기능을 넣었을떄 복잡하게 되지만
api같은 하나의 기능으로서 일부부분을 제한적으로 분산시켜
binding하는 경우 가독성도 좋은 점이 있어 class형과 함수형을 적재적소에 사용하는 것이 제일 이상적이다. </p>
<p><strong>app.jsx, app.js 로 구분해서 사용하는 이유는 리액트 문법으로 사용되는 것인지 자바스크립트로 작성된 것인지 확인하기 위함</strong></p>
<pre><code>import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom&#39;;
import &#39;./index.css&#39;;
import App from &#39;./App&#39;;
import &#39;@fortawesome/fontawesome-free/js/all.js&#39;;

ReactDOM.render(
  &lt;React.StrictMode&gt;
    &lt;App /&gt;
  &lt;/React.StrictMode&gt;,
  document.getElementById(&#39;root&#39;)
);</code></pre><p>reactDom을 호출하고 index.html에 있는 root에 연결되면서 App컴퍼넌트를 그려줌 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[about Binding]]></title>
            <link>https://velog.io/@deathsizes_86/about-Binding</link>
            <guid>https://velog.io/@deathsizes_86/about-Binding</guid>
            <pubDate>Mon, 30 Aug 2021 12:16:48 GMT</pubDate>
            <description><![CDATA[<pre><code>  constructor(carrotCount, bunCount) {
    this.field.addEventListener(&quot;click&quot;, this.onClick);
  }

  onClick(event) {
    const target = event.target;
    if (target.matches(&quot;.carrot&quot;)) {
      target.remove();
      sound.playCarrot()
      this.onItemClick &amp;&amp; this.onItemClick(&quot;carrot&quot;);
    } else if (target.matches(&quot;.bug&quot;)) {
      this.onItemClick &amp;&amp; this.onItemClick(&quot;bug&quot;);
    }
  }

</code></pre><p>위 코드를 통해 봤을떄 일반적인경우라면 상단 setClickListener 함수에 전달된 onItemClick에 onClick의 클래스가 상속되야 하는 것이 일반적이나, 자바스크립트에서는 상속되지 못해 callback함수가 실행되지 못하는 문제가 발생한다. 
그런때에 이문제를 해결하기 위해 this binding을 한다. 
그 반인딩에는 3가지 방법이 있는데 
<strong>1. this정의</strong>
this.onClick = this.onClick.bind(this)</p>
<p><strong>2. 전달받는 쪽의 바인딩</strong>
하지만 위 방법은 사용할떄마다 작성해야하는 불편함이 있어 화살표 함수를 사용하여 바인딩된 값을 전달 할 수있다.
this.field.addEventListener(&quot;click&quot;, (event) =&gt; this.onClick(event));</p>
<p><strong>3. 전달하는 쪽의 바인딩</strong>
위 방법을 활용하여 전달하는 쪽을 수정하는 방법으로도 많이 사용한다. </p>
<pre><code>onClick = event =&gt; {
    const target = event.target;
    if (target.matches(&quot;.carrot&quot;)) {
      target.remove();
      sound.playCarrot()
      this.onItemClick &amp;&amp; this.onItemClick(&quot;carrot&quot;);
    } else if (target.matches(&quot;.bug&quot;)) {
      this.onItemClick &amp;&amp; this.onItemClick(&quot;bug&quot;);
    }
  }</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[엘리드림코딩_자바스크립트게임 프로젝트 01]]></title>
            <link>https://velog.io/@deathsizes_86/%EC%97%98%EB%A6%AC%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-01</link>
            <guid>https://velog.io/@deathsizes_86/%EC%97%98%EB%A6%AC%EB%93%9C%EB%A6%BC%EC%BD%94%EB%94%A9%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-01</guid>
            <pubDate>Thu, 26 Aug 2021 02:44:14 GMT</pubDate>
            <description><![CDATA[<h1 id="자바스크립트를-이용한-게임-프로젝트">자바스크립트를 이용한 게임 프로젝트</h1>
<h2 id="내용--순수한-자바스크립트를-이용하여-dom요소를-조작하여-만드는-프로젝트">내용 : 순수한 자바스크립트를 이용하여 dom요소를 조작하여 만드는 프로젝트</h2>
<h3 id="프로젝트-내용">프로젝트 내용</h3>
<p>플레이버튼을 눌르게 되면 카운트가 시작되면서 시간내에 벌레와 당근을 잡는 게임 </p>
<h3 id="기능구현-내용">기능구현 내용</h3>
<p>플레이버튼을 누르게 될때
벌레와 당근 생성
카운트 시작 
벌레나 당근 잡는 갯수 카운트
다시시작 버튼</p>
<p><img src="https://images.velog.io/images/deathsizes_86/post/5ea2c9ab-5d71-4e79-8178-271ef5b43f7f/%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%202021-08-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.02.57.png" alt=""></p>
<h3 id="프로젝트에서-처음-사용한-함수">프로젝트에서 처음 사용한 함수</h3>
<p>querySelector(.cssclass) - class를 찾아 선택한다.<br>element.getBoundingClientRect() - 위 셀렉터로 정의된 범위의 창 크기정보를 불러온다. 
createElement(&#39;htmltag&#39;) - html태그요소를 생성
setAttribute(&#39;class&#39;, className) - 생성된 엘리먼트의 추가요소를 생성 <em>ex-<tag class="className"></tag></em>
radomNumber - 내장함수 random()을 이용한 랜덤함수
setInterval - 설정한 시간동안 지정된 함수를 반복 실행
element.innerText - htmltag사이 텍스트 삽입
element.style.type - style 타입과 값 삽입
element.appendChild() - element 하위 생성된child값 붙혀넣기 </p>
<pre><code>function radomNumber(min, max){
    return Math.random() * (max - min) + min;
}</code></pre><h4 id="오브젝트-좌표구현">오브젝트 좌표구현</h4>
<pre><code>function initGame() {
    console.log(fieldRect)
    addItem(&#39;carrot&#39;, 5, &#39;img/carrot.png&#39;)
    addItem(&#39;bug&#39;, 5, &#39;img/bug.png&#39;)


}
function addItem(className, count, imgPath){
    const x1 = 0;
    const y1 = 0;
    const x2 = fieldRect.width - CARROT_SIZE;
    const y2 = fieldRect.height- CARROT_SIZE;
    for(let i = 0; i &lt; count; i++){
        const item = document.createElement(&#39;img&#39;)
        item.setAttribute(&#39;class&#39;, className);
        item.setAttribute(&#39;src&#39;, imgPath);
        item.style.position = &#39;absolute&#39;;
        const x = radomNumber(x1, x2);
        const y = radomNumber(y1, y2);
        item.style.left = `${x}px`;
        item.style.top = `${y}px`;
        field.appendChild(item);
    }
}</code></pre><p>함수 클래스이름, 오브젝트갯수, 이미지경로를 인자값에 할당시켜 위에 지정한 갯수만큼 html, style값을 생성하는 함수를 만들어 설정. 랜덤함수를 사용하여 x y값을 각 오브젝트에 스타일값이 할당되도록 하여 벌레와 당근이 윈도우 내에 임의의 좌표로 출력되도록 구현</p>
<h4 id="타이머구현">타이머구현</h4>
<pre><code>const GAME_DURATION_SEC = 5;

function startGameTimer(){
    let remainingTimeSec = GAME_DURATION_SEC;
    upadteTimerText(remainingTimeSec);
    timer = setInterval(()=&gt;{
        if(remainingTimeSec &lt;= 0){
            clearInterval(timer);
            return;
        }
        upadteTimerText(--remainingTimeSec);
    }, 1000)
}

function upadteTimerText(time){
    const minutes = Math.floor(time / 60);
    const seconds = time % 60
    gameTimer.innerText = `${minutes}:${seconds}`
}
</code></pre><p>코드 내용. 
setInterval를 사용해 반복되면서 remainingTimeSec로 할당된 5초를 줄여나가면서 upadteTimerText()함수 실행 카운트가 0이 되면 타이머 종료 api를 호출하고clearInterval(timer) return을 이용해서 조건문 탈출 </p>
<h4 id="gamestop">gameStop</h4>
<pre><code>function stopGame(){
    stopGameTimer();
    hideGameButton();
    showPopupWithText(&#39;REPLAY&#39;);
}

function stopGameTimer(){
    clearInterval(timer);
}
function hideGameButton(){
    gameBtn.style.visibility = &#39;hidden&#39;;
}
function showPopupWithText(text){
    popUpText.innerHTML = text;
    popUp.classList.remove(&#39;pop-up--hide&#39;)
}</code></pre><p>스톱타이머의 경우 앞서 셋타이머에서 생성된 clearInterval api를 다시 호출,
게임버튼을 숨기기 위해 css visibility 값 지정했던 것을 변경
위의 텍스트값을 전달받아 해당값이 태그에 쒸어지면서 보여지고 기본값으로 hide 처리 되어있던 class지정값을 삭제(삭제되면서 css지정되있던 display: none이 삭제). </p>
<h4 id="click-field">click field</h4>
<pre><code>field.addEventListener(&#39;click&#39;, (event) =&gt;onFieldClick(event))

function onFieldClick(event){
    if(!started){
        return;
    }const target = event.target;
    if(target.matches(&#39;.carrot&#39;)){
        target.remove();
        score++;
        updateScoreBoard()}
        if(score === CARROT_COUNT){
            finishGame(true)
        }
        else if (target.matches(&#39;.bug&#39;)){
            stopGameTimer();
            finishGame(false)
        }
    };
    function updateScoreBoard(){
    gameScore.innerText = CARROT_COUNT - score;
}

function finishGame(win) {
    started = false;
    hideGameButton();
    showPopupWithText(win ? &#39;WIN💯&#39; : &#39;LOSE🖕&#39;)
}
function hideGameButton(){
    gameBtn.style.visibility = &#39;hidden&#39;;
}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[back to basic and consistency]]></title>
            <link>https://velog.io/@deathsizes_86/back-to-basic-and-consistency</link>
            <guid>https://velog.io/@deathsizes_86/back-to-basic-and-consistency</guid>
            <pubDate>Tue, 17 Aug 2021 04:10:32 GMT</pubDate>
            <description><![CDATA[<h1 id="backtobasic">backtobasic</h1>
<p>요즘 개발관련된 흥미를 잊어버린 상태고 집중이 끊기 있게 되지 못해서 고민이 많던 차였다. 그러던중 강경원이라는 유명한 바디빌딩의 영상을 보면서 영감을 느꼈는데 영감받은 내용은 위 주제와 같이 <strong>backtobasic</strong> 기본으로 돌아가라는 것이다. 이 말을 듣고 내자신에 대해서 곰곰히 생각해본 결과 모든게 리셋된 상태에서 했던 부분에서 이어 가려니 집중도 안되고 되던것도 안되는 것이란 판단이 됬다. 그래서 다시 기본부터 다시 차근차근 wil까지 작성해보려 한다. 한번 해보자 도전! </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[WIL(Weekly I Learned)_210411]]></title>
            <link>https://velog.io/@deathsizes_86/WILWeekly-I-Learned210411</link>
            <guid>https://velog.io/@deathsizes_86/WILWeekly-I-Learned210411</guid>
            <pubDate>Sun, 11 Apr 2021 15:11:04 GMT</pubDate>
            <description><![CDATA[<h2 id="미니-프로젝트">미니 프로젝트</h2>
<h3 id="api">API</h3>
<p>이번 프로젝트에서 핵심적으로 많이 느낀 점은 api 통신 방식이다. 
기존 교육때 배운내용은 서버리스 (파이어베이스) 와 같은 것으로 통신하고 서버를 관리하는 것 까지 배웠는데, 백엔드 파트에서 작업해주는 것을 CRUD하는 부분을 많이 배우고 느꼈다. 
제일 명확하게 개념 정리가 된부분의 로그인의 토큰 부분인데, 
일반 홈페이지의 경우 <strong>header</strong> 부분에서 토큰을 관리하지만, 앱같은 경우 <strong>asyncstorage</strong>를 통해 관리하는 부분이 흥미로웠던 점이다. 하나 예시 코드를 작성하면 </p>
<pre><code>export async function login(id, password, navigation) {
  try {
    const result = await axios({
      method: &#39;post&#39;,
      url: host + &#39;/auth&#39;,
      data: {
        id: id,
        password: password,
      },
    });

    if(result.data.msg == &quot;success&quot;) {
      Alert.alert(&#39;로그인 성공!&#39;);
      console.log(result.data.token)
      await AsyncStorage.setItem(&#39;session&#39;, &quot;Bearer&quot; + result.data.token);
      navigation.push(&#39;TabNavigator&#39;);
    } else if (result.data.msg == &quot;fail&quot;) {
      Alert.alert(&#39;로그인에 실패했습니다.&#39;);
    }
  } catch (err) {
    Alert.alert(&#39;무슨 문제가 있는 것 같아요! =&gt; &#39;, err.message);
  }
}</code></pre><p>위 코드는 데이터를 서버에 전송하는 함수로 여기서 구체적으로 눈여겨 보게 된 점이 함수를 사용하는 여러 과정 (지역변수, 매게변수, 호출 과정, 비동기처리) 등등인데 자바스크립트 언어에 대한 사전 교육이 많이 부족한 상태라 코드를 짜기 많이 힘들어 부끄럽지만 백엔드에 자바스크립트 개념을 잘 알고 있는 개발자에게 조언을 구해가며 겨우겨우 짜내었다. (일부는 아예 다 해준 것도 있다.) 이 과정을 통해 자바스크립트를 명확하게 공부할 필요성을 느껴 주말에 드림코딩 강좌를 통해 쭉 정리 해봤다. 차 후 자바스크립트 개념도 정리해서 올려야 겠다는 생각이 든다. 
조금 이야기가 한쪽으로 샌 부분이 있으나, 내용을 보면 
<strong>await AsyncStorage.setItem(&#39;session&#39;, &quot;Bearer&quot; + result.data.token);</strong>
이부분이 보일 것이다. 이 것이 토큰값을 session이라는 통에 넣어 관리 하는 것이고 그외에 통값의 변수를 달리하여 여러가지 정보를 휴대전화에 보관이 가능한 것을 알게되었다.
위 기능을 통해 다양한 기능을 구현해 볼 수 있도록 노력해야겠다. 
(그리고 자바스크립트 언어도 하나씩 꾸준히) </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[WIL(Weekly I Learned)_210404]]></title>
            <link>https://velog.io/@deathsizes_86/WILWeekly-I-Learned210404</link>
            <guid>https://velog.io/@deathsizes_86/WILWeekly-I-Learned210404</guid>
            <pubDate>Sun, 04 Apr 2021 12:58:02 GMT</pubDate>
            <description><![CDATA[<h4 id="4주차일기장-미니프로젝트">4주차일기장 미니프로젝트</h4>
<p><strong>리액트 네이티브 심화과정 실습 (Navigator/Components)</strong></p>
<p>심화강의 그리고 기본강의에 아직도 정리되지 않은 개념과 기본기가 너무 많지만, 
시간관계상 바로 들어갔다. 우선 StackNavigator, TabNavigator 개념과 Components 요소들을 더욱 활용하게 되면서 이해도가 많이 올라갔다. 
헷갈렸던 부분이 스택네비게이터와 탭네비게이터를 연결해서 연동하는 과정이 어려웠는데, 결국 쉽게 정리하면 스택네비게이터에는 맨처음보이게 되는 부분과, 꺼내서 쓸 수 있는 페이지를 넣어두는 것. 그리고 기존에 있는 내용들을 state관리를 통해 초기화해서 새로운 스택으로 활용이 가능한 점을 알았다. 아직 초기화 되는 부분을 명확히 구현을 못해보았지만 그 외의 부분은 명확하게 구현하는 것으로 많은 이해를 얻었다. 그다음 TabNav 같은 경우 하단에 고정으로 픽스시킬 메뉴들을 구현하는 것인데, Icon을 적용하는 과정 중 Ionicons 아이콘 카테고리(애플과 안드로이드 모두 사용가능한 아이콘 모음)중 사용가능한 아이콘이 많지 않아서 (혹은 못하거나) 불편 혹은 어려움을 겪었다. </p>
<p><strong>클론코딩 (당근마켓) 스타트</strong></p>
<p>우선 인원은 RN맴버 두명, NODE맴버 3명으로 총인원 5명으로 구성되어 팀 작업을 시작했다. 
아래 노션링크를 통하여 업무를 분배하고 나는 구현해 본 적이 없던 로그인 기능을 </p>
<p>(<a href="https://www.notion.so/_clone-831e9dc759714a06867d6cb349c7540a">https://www.notion.so/_clone-831e9dc759714a06867d6cb349c7540a</a>)</p>
<p>구현해보기로 했다. 일단 튜토리얼 가이드대로 차근차근 정리하면서 붙혀넣었기 때문에 시작은 어려움이 없었고, 잘풀려서 재미있었다.(하라는대로 적용하면 되니깐)
그리고 api를 연결하는 과정에서 막다른길에 다다랐다. 
아래는 파이어 베이스를 활용했던 코드인데, 아직 자바스크립트도 미숙한 상태에서
외부 링크를 연결하는 로직을 짜는 것은 내게 너무나도 어려운 과업이었다. 
결국 튜터님께 부탁해서 </p>
<pre><code>export async function registration(nickName, email, password) {
    try {
        console.log(nickName, email, password)
        await firebase.auth().createUserWithEmailAndPassword(email, password);
        const currentUser = firebase.auth().currentUser;
        console.log(currentUser)
        Alert.alert(&quot;회원가입 성공!&quot;)
    } catch (err) {
        Alert.alert(&quot;무슨 문제가 있는 것 같아요! =&gt; &quot;, err.message);
    }
}</code></pre><p><strong>튜터님으로부터 받은 api call 예시</strong></p>
<pre><code>const fetchFollowRequestListApi = () =&gt;
  axios.get(HOST + `/api/follows/requested-list/`,
    {
      headers: { Authorization: `Bearer ${token}` },
    }
  );


const approveAllFollowsApi = (payload) =&gt;
  axios.post(HOST + `/api/follows/approve-all/`,
    payload,
    {
      headers: { Authorization: `Bearer ${token}` },
    }
  );</code></pre><p>문제는 봐도 이해가 잘 가지 않았던 부분이다. 
경로 설정을 하는 것은 이해가 갔으나, 변수를 어떻게 설정해서 출력하고 뽑아내고 해줘야할 지 앞이 깜깜했다. 그래서 튜터님이 다시 정리해서 보내주셨는데 </p>
<pre><code>axios.get(someUrl).then((res) =&gt; {
  console.log(res);
  const data = res.data; 
});</code></pre><p>아래와 같이 보내주셔서 우선</p>
<pre><code>export async function registration(nickName, email, password) {
    try {
        axios.get(url).then(nickName, email, password)
        console.log(nickName, email, password)
        const currentUser = nickName.currentUser;
        const currentUser = email.currentUser;
        const currentUser = password.currentUser;

        console.log(currentUser)
        Alert.alert(&quot;회원가입 성공!&quot;)
    } catch (err) {
        Alert.alert(&quot;무슨 문제가 있는 것 같아요! =&gt; &quot;, err.message);
    }
}</code></pre><p>위와 같이 정리해보았다. 하지만 currentUser값에 내가 원하는대로 변수가 다 포함이 되었는지가 불명확한 점이 있어서 좀더 알아보고 보완해봐야 할 거 같다. 
이번 api를 주고 받는 과정에 대하여 이해도가 높아지다면 큰 성장을 이룰 것 같다. (내피셜)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[WIL(Weekly I Learned)_210325]]></title>
            <link>https://velog.io/@deathsizes_86/WILWeekly-I-Learned210325</link>
            <guid>https://velog.io/@deathsizes_86/WILWeekly-I-Learned210325</guid>
            <pubDate>Thu, 25 Mar 2021 11:32:35 GMT</pubDate>
            <description><![CDATA[<h1 id="reactnative">ReactNative</h1>
<h2 id="1주차-이야기">1주차 이야기</h2>
<p>목금에 기본 강의를 듣고 리액트 네이티브를 이용한 강의를 듣고, 1차 과제인 todolist를 했다. 
native 프레임 워크에서 사용되는 특징으로 아래 공식에 대해서 배웠는데, 처음에 무슨말인지 몰라서 강의보고 보고나서 자료를 보고 여러번 돌려보면서 3일만에 겨우 이해할 수 있었다. (지금도 제대로 이해한건지 얼떨떨하다)
  <strong>component(state)=UI</strong> </p>
<p>  위 내용은 state라는 데이터관리를 통하여 콤포넌트요소들을 정리하여 유저인터페이스를 출력한다는 요약식이다. 어떤분이 정리한 건지 모르겠으나 짧고 명료하고 강력하게 정리한거 같았다. 그리고 각각 요소를 만들어내기 위해서 빨간색 바탕의 많은 오류를 겪어왔는데 정말 너무 힘들었다. (오류가 너무 자주 발생되었기 떄문)
  이제 이 빨간화면이 하는말을 잘 알아보고 바로바로 대처할 수 있는 능력일 키워야할텐데 두려움 반 기대반이다. 열심히 해보자 앞으로도 가야할길이 너무 멀다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[WIL(Weekly I Learned)_210321]]></title>
            <link>https://velog.io/@deathsizes_86/WILWeekly-I-Learned210321</link>
            <guid>https://velog.io/@deathsizes_86/WILWeekly-I-Learned210321</guid>
            <pubDate>Sun, 21 Mar 2021 14:48:59 GMT</pubDate>
            <description><![CDATA[<h3 id="항해-3주차">항해 3주차</h3>
<p><strong>진행내용 알고리즘</strong>
1 2 주차에서 파이썬 기본문법 개념과 문제를 푸는 요령도 잘 몰라서 팀 스케쥴을 따라가지 못했었다. 하면서 크게 느꼈던 점은 기본문법과 알고리즘 개념, 그리고 문제접근 방법에대한 배경지식이 없을때 문제를 접하는 것은 시간낭비임을 크게 느꼈다. 그부분을 느꼈던 것이 2주차에서부터였었고 나는 기본기가 적힌 서적을 통해 1회독을 실습해보았으나, 그것만으로 머리속에 개념이 확고하게 잡히지 않은 것을 느낄 수 있었다. 그래서 다시 시도한 것이 백준 수준 개념별 문제를 풀어가면서 개념을 정리해보았다. 쉬운 문제를 풀면서 예전에는 보이지 않았던 문제의 길이 보이기 시작했다. 하지만 배열과 반복문 개념에서 다시 막히게 되었다. 확실하게 개념이 잡히지 않은 부분일 수록에 쉽게 무너지는 것을 깨달았다. 우선 항해 스케쥴에는 맞출 수 없더라도 기본 개념을 다시 차근차근 밟아가야했다. 스케쥴에는 동적계획법, 백트래킹을 개념을 익히기를 권장했으나, 거기까지 가지는 못했다. 하지만 이후 주특기 과정을 보면서 코드들을 보고나니 이전보다는 코드를 보는 눈이 조금은 더 생긴 것을 꺠달았다. 조금 버벅이고 있고 남들보다는 느리지만 꾸준히 앞으로 가고 있다. 전진...</p>
]]></description>
        </item>
    </channel>
</rss>