<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>lets_gojae.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 02 Mar 2021 11:12:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>lets_gojae.log</title>
            <url>https://images.velog.io/images/lets_gojae/profile/2b2b7279-5e55-4b1e-85dc-9e3bb6d54826/KakaoTalk_20200713_223149991.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. lets_gojae.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lets_gojae" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[React native - Weather API, geolocation]]></title>
            <link>https://velog.io/@lets_gojae/React-native-Weather-API-geolocation</link>
            <guid>https://velog.io/@lets_gojae/React-native-Weather-API-geolocation</guid>
            <pubDate>Tue, 02 Mar 2021 11:12:59 GMT</pubDate>
            <description><![CDATA[<h1 id="weather-api">Weather API</h1>
<p>Fetch API를 사용하여 앱 외부에 있는 날씨 데이터를 가져오기 위해서는 날씨 정보를 가지고 있는 API가 필요합니다. </p>
<ul>
<li>OpenWeather: <a href="https://openweathermap.org/api">https://openweathermap.org/api</a></li>
</ul>
<p>OpenWeather에서 제공하는 날씨 API를 사용하기 위해서는 회원가입이 필요하고 회원 가입을 하면, 날씨 API를 사용할 수 잇는 키를 가입할 때 사용한 이메일로 발송됩니다.
이 키를 사용하여 날씨 정보를 가져올 수 있습니다.</p>
<h1 id="위치-정보">위치 정보</h1>
<p>이번 예제에서는 react-native-geolocation-service 라이브러리를 사용하여 위치 정보를 습득할 예정입니다.</p>
<ul>
<li>react-native-geolocation-service: <a href="https://github.com/Agontuk/react-native-geolocation-service">https://github.com/Agontuk/react-native-geolocation-service</a></li>
</ul>
<p>react-native-geolocation-service 라이브러리를 사용하기 위해서는 다음 명령어를 사용하여 라이브러리를 설치합니다.</p>
<p><code>npm install -save react-native-geolocation-service</code></p>
<p>iOS에서 react-native-geolocation-service를 사용하여 위치 정보를 습득하기 위해서는 코코아포드를 통해 필요한 라이브러리를 링크하기 위해 ./ios/Podfile을 열고 수정합니다.</p>
<pre><code>require_relative &#39;../node_modules/react-native/scripts/react_native_pods&#39;
require_relative &#39;../node_modules/@react-native-community/cli-platform-ios/native_modules&#39;

platform :ios, &#39;10.0&#39;

target &#39;WeatherApp&#39; do
  ...
  pod &#39;react-native-geolocation&#39;, path: &#39;../node_modules/@react-native-community/geolocation&#39;

  target &#39;WeatherAppTests&#39; do
    inherit! :search_paths
    # pods for testing
  end

  use_native_modules!

end
...
</code></pre><p>파일을 수정했다면 라이브러리를 명령어로 연동합니다.</p>
<pre><code># cd ios
pod install</code></pre><p>iOS, 안드로이드에서 위치 정보를 사용하기 위해서는 사용자 권한(promission) 설정이 필요합니다. iOS에서 권한 설정을 하기 위해, ./ios/Weather/Info.plist 파일을 열고 NSLocationWhenInUseUsageDescripton을 찾아서 수정합니다. </p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
&lt;plist version=&quot;1.0&quot;&gt;
&lt;dict&gt;
    ...
    &lt;key&gt;NSLocationWhenInUseUsageDescription&lt;/key&gt;
    &lt;string&gt;날씨 정보를 가져오기 위해서는 위치 정보 권환이 필요합니다.
    ...
&lt;/dict&gt;
&lt;/plist&gt;
</code></pre><p>이것으로 react-native-geolocation-service 라이브러리를 사용하여 위치 정보를 가져올 준비가 끝났습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React native - FlatList]]></title>
            <link>https://velog.io/@lets_gojae/React-native-FlatList</link>
            <guid>https://velog.io/@lets_gojae/React-native-FlatList</guid>
            <pubDate>Wed, 17 Feb 2021 08:36:41 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>data : 리스트 뷰에 표시할 데이터의 배열</p>
</li>
<li><p>keyExtractor : React에서 반복적으로 동일한 컴포넌트를 표시하기 위해서는 컴포넌트에 키 값을 설정해야 합니다. React는 키 값을 보고 컴포넌트를 구별하는데, 키 값을 설정하지 않으면 어떤 컴포넌트를 업데이트 해야 할지 구별할 수 없어 예상치 못한 결과를 가져옵니다. 키 값을 설정하지 않으면 React에서는 경고를 표시합니다. keyExtractor는 FlatList에서 Item에 키 값을 설정하기 위한 Props입니다.</p>
</li>
<li><p>ListEmptyComponent : 주어진 배열에 데이터가 없을 경우 표시되는 컴포넌트입니다. </p>
</li>
<li><p>renderItem : 주어진 배열에 데이터를 사용하여 반복적으로 표시될 컴포넌트입니다.</p>
</li>
<li><p>contentContainerStyle={todoList.length === 0 &amp;&amp; {flex: 1}} : 표시할 데이터가 없는 경우, ListEmptyComponent의 컴포넌트가 표시됩니다. 하지만 이 컴포넌트도 하나의 리스트 아이템으로 표시되기 때문에 전체 화면으로 표시되지 않습니다. 이 컴포넌트를 전체 화면으로 표시하기 위해 flex:1을 설정합니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[React native 프로젝트 준비(typescript, styled-components, babel-plugin-root-import)]]></title>
            <link>https://velog.io/@lets_gojae/React-native-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A4%80%EB%B9%84typescript-styled-components</link>
            <guid>https://velog.io/@lets_gojae/React-native-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A4%80%EB%B9%84typescript-styled-components</guid>
            <pubDate>Mon, 08 Feb 2021 09:23:40 GMT</pubDate>
            <description><![CDATA[<p>react native CLI 명령어를 사용하여 프로젝트를 생성합니다.</p>
<ul>
<li><code>react-native init projectname</code></li>
</ul>
<p>Typescript, styled-components, babel-plugin-root-import를 설치합니다.</p>
<ul>
<li><code>cd ProjectName</code></li>
<li><code>npm install --save styled-components</code></li>
<li><code>npm install --save-dev typescript @types/react @types/react-native @types/styled-components babel-plugin-root-import</code></li>
</ul>
<p>설치가 완료되면 타입스크립트 설정을 위해 tsconfig.json 파일을 생성하고 아래 내용을 추가합니다.</p>
<blockquote>
<pre><code>{
  &quot;compilerOptions&quot;: {
    &quot;allowJs&quot;: true,
    &quot;allowSyntheticDefaultImports&quot;: true,
    &quot;esModuleInterop&quot;: true,
    &quot;isolatedModules&quot;: true,
    &quot;jsx&quot;: &quot;react&quot;,
    &quot;lib&quot;: [&quot;es6&quot;],
    &quot;moduleResolution&quot;: &quot;node&quot;,
    &quot;noEmit&quot;: true,
    &quot;strict&quot;: true,
    &quot;target&quot;: &quot;esnext&quot;,
    &quot;baseUrl&quot;: &quot;./src&quot;,
    &quot;paths&quot;: {
      &quot;~/*&quot;: [&quot;*&quot;]
    }
  },
  &quot;exclude&quot;: [
    &quot;node_modules&quot;,
    &quot;babel.config.js&quot;,
    &quot;metro.config.js&quot;,
    &quot;jest.config.js&quot;
  ]
}</code></pre></blockquote>
<pre><code>
절대 경로로 컴포넌트를 추가하기 위해 babel.config.js 파일을 열고 아래와 같이 수정합니다.

&gt; ```
module.exports = {
  presets: [&#39;module:metro-react-native-babel-preset&#39;],
  plugins: [
    [
      &#39;babel-plugin-root-import&#39;,
      {
        rootPathPrefix: &#39;~&#39;,
        rootPathSuffix: &#39;src&#39;,
      },
    ],
  ],
};</code></pre><p>소스코드를 한곳에서 관리하기 위해서 src폴더를 생성하고 App.js파일을 App.tsx로 변경하고 src폴더로 이동시킵니다.</p>
<p>마지막으로 index.js 파일을 열어 아래와 같이 수정합니다.</p>
<pre><code>import App from &#39;./App&#39;;
import App from &#39;~/App&#39;;</code></pre><p>App.tsx에서 
<code>import Styled from &#39;styled-components/native&#39;;</code>이 부분에</p>
<pre><code>react native could not find a declaration file for module &#39;styled-components/native</code></pre><p>이와 같은 에러문구가 생기면 </p>
<pre><code>npm add @types/styled-components-react-native -D</code></pre><p>추가 해주시면 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React native material Icon]]></title>
            <link>https://velog.io/@lets_gojae/React-native-material-Icon</link>
            <guid>https://velog.io/@lets_gojae/React-native-material-Icon</guid>
            <pubDate>Mon, 08 Feb 2021 08:37:43 GMT</pubDate>
            <description><![CDATA[<ul>
<li>아이콘 다운로드 링크 : <a href="https://material.io/resources/icons/?style=baseline">https://material.io/resources/icons/?style=baseline</a></li>
</ul>
<p><img src="https://images.velog.io/images/lets_gojae/post/565ca3f8-7550-4338-bd92-ab8e56655fa8/%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-02-08%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.24.01.png" alt=""></p>
<p>18dp라고 표시된 부분을 iOS로 변경하여 다운로드합니다. 완료되면 2x, 3x사이즈의 이미지가 함께 다운로드되는데, 여기서 iOS로 변경하고 다운로드 하는 이유는 이 이미지를 iOS에서만 사용하기 위해서가 아닙니다.
React native에서는 원본 사이즈 이미지, 2배 사이즈, 3배 사이즈가 필요하기 때문입니다. React native에서는 이렇게 제공된 이미지를 활용하여 iOS와 안드로이드에서 자동적으로 필요한 이미지를 표시합니다.</p>
<p>다운로드한 이미지를 해당 폴더로 이동하여(예 : src/Assets/Images) add.png, <a href="mailto:add@2x.png">add@2x.png</a>, <a href="mailto:add@3x.png">add@3x.png</a>로 이름을 변경합니다. @2x, @3x는 이미지 파일 이름의 규칙으로 이미지를 불러올 때 React native가 iOS와 안드로이드에서 해당 화면 사이즈에 맞는 이미지를 자동으로 불러옵니다.</p>
<p><img src="https://images.velog.io/images/lets_gojae/post/d2bab819-8e2f-4358-883f-cfb984b63538/%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-02-08%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.35.16.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[react native could not find a declaration file for module 'styled-components/native]]></title>
            <link>https://velog.io/@lets_gojae/react-native-could-not-find-a-declaration-file-for-module-styled-componentsnative</link>
            <guid>https://velog.io/@lets_gojae/react-native-could-not-find-a-declaration-file-for-module-styled-componentsnative</guid>
            <pubDate>Wed, 03 Feb 2021 08:14:22 GMT</pubDate>
            <description><![CDATA[<p><code>npm add @types/styled-components-react-native -D</code>
해결 완료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Failed to build iOS project. We ran "xcodebuild" command but it exited with error code 65.(mac react-native)]]></title>
            <link>https://velog.io/@lets_gojae/Failed-to-build-iOS-project.-We-ran-xcodebuild-command-but-it-exited-with-error-code-65.mac-react-native</link>
            <guid>https://velog.io/@lets_gojae/Failed-to-build-iOS-project.-We-ran-xcodebuild-command-but-it-exited-with-error-code-65.mac-react-native</guid>
            <pubDate>Wed, 03 Feb 2021 08:05:26 GMT</pubDate>
            <description><![CDATA[<ol>
<li>cd ios</li>
<li>pod install</li>
<li>cd ..</li>
<li><code>npm run ios</code> </li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Native 환경 세팅하기]]></title>
            <link>https://velog.io/@lets_gojae/React-Native-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@lets_gojae/React-Native-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 01 Feb 2021 16:26:34 GMT</pubDate>
            <description><![CDATA[<h1 id="homebrew-설치">Homebrew 설치</h1>
<p>Homebrew는 맥(Mac)에서 필요한 패키지를 설치하는 관리자입니다.</p>
<ul>
<li>Homebrew: <a href="https://brew.sh/">https://brew.sh/</a></li>
</ul>
<p>설치를 완료하면,
<code>brew --version</code>
정상적으로 설치가 되어 있으면, 
<code>Homebrew 2.6.1</code> 
<code>Homebrew/homebrew-core (git revision dd4e1d; last commit 2020-12-11)
Homebrew/homebrew-cask (git revision 96bb38; last commit 2020-12-11)</code></p>
<h1 id="nodejs-설치">Nodejs 설치</h1>
<p>react-native는 Javascript이므로 Javascript의 런타임인 Nodejs가 필요합니다.</p>
<ul>
<li>Nodejs: <a href="https://nodejs.org/">https://nodejs.org/</a></li>
</ul>
<p>설치 후 또는 설치가 되어 있는지 확인합니다.
<code>brew install node</code>
설치를 완료하면,
<code>node --version</code>
정상적으로 설치가 되어 있으면
<code>v12.18.3</code>
Nodejs를 설치하면 기본적인 패키지 매니저인 npm도 같이 설치됩니다. 설치가 되었는지 확인합니다.
<code>npm --version</code>
정상적으로 설치가 되었다면
<code>6.14.6</code></p>
<h1 id="watchman-설치">Watchman 설치</h1>
<p>Watchman은 특정 폭더나 파일을 감시하다가 변화가 생기면, 특정 동작으로 실행하도록 설정하는 역할을 합니다.</p>
<ul>
<li>Watchman: <a href="https://facebook.github.io/watchman/">https://facebook.github.io/watchman/</a>
<code>brew install watchman</code>
설치를 완료하면,
<code>watchman --version</code>
정상적으로 설치가 되어 있으면
<code>4.9.0</code><h1 id="react-native-cli설치">React Native Cli설치</h1>
react-native로 앱을 개발하기 위해 필요한 CLI를 설치합니다.
<code>npm install -g react-native-cli</code>
설치를 완료하면,
<code>react-native --version</code>
정상적으로 설치가 되어 있으면
<code>react-native-cli: 2.0.1
react-native: n/a - not inside a React Native project</code><h1 id="xcode-설치">Xcode 설치</h1>
react-native로 iOS 앱을 개발하기 위해서는 iOS 개발 툴인 Xcode가 필요합니다.
앱 스토어에서 Xcode를 다운로드 합니다.</li>
<li>Xcode 다운로드 링크: <a href="https://apps.apple.com/us/app/xcode/id497799835?mt=12">https://apps.apple.com/us/app/xcode/id497799835?mt=12</a><h1 id="cocoapods-설치">Cocoapods 설치</h1>
Cocoapods는 iOS 개발에 사용되는 관리자입니다.</li>
<li>Cocoapods: <a href="https://cocoapods.org/">https://cocoapods.org/</a>
React native로 iOS를 개발하려면 꼭 필요한 관리자이므로 설치를 합니다.
<code>sudo gem install cocoapods</code>
설치를 완료하면,
<code>pod --version</code>
정상적으로 설치가 되어 있으면
<code>1.10.0</code><h1 id="jdk-설치">JDK 설치</h1>
react native로 안드로이드 앱을 개발하기 위해서는 JDK(Java Development Kit)를 설치 해야 합니다.
<code>brew tap AdoptOpenJDK/openjdk</code>
<code>brew cask install adoptopenjdk8</code>
설치를 완료하면,
<code>java -version</code>
정상적으로 설치가 되어 있으면,
<code>openjdk version &quot;1.8.0_275&quot;</code>
JDK를 설치하면 Java 컴파일러도 같이 설치됩니다.
<code>javac -version</code>
정상적으로 설치가 되어 있으면,
<code>javac 1.8.0_275</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[react native]]></title>
            <link>https://velog.io/@lets_gojae/react-native</link>
            <guid>https://velog.io/@lets_gojae/react-native</guid>
            <pubDate>Sun, 01 Nov 2020 06:18:00 GMT</pubDate>
            <description><![CDATA[<h1 id="basic-components">Basic Components</h1>
<ol>
<li>View - UI 구축하기 위한 가장 기본적인 태그</li>
<li>Text - 텍스트를 표시하기 위한 구성요소</li>
<li>Image - 이미지를 표기하기 위한 태그</li>
<li>TextInput - 키보드를 통해 앱에 텍스트를 입력하기 위한 태그</li>
<li>ScrollView - 여러 구성 요소 및 보기를 호스팅 할 수 있는 스크롤 컨테이너</li>
<li>StyleSheet - CSS 스타일 시트와 유사한 추상화 계층</li>
</ol>
<h1 id="user-interface">User Interface</h1>
<ol>
<li>Button - 모든 플랫폼에서 렌더링 되어야 하는 터치를 처리하기 위한 기본 버튼 태그</li>
<li>Switch- 스위치 토글 버튼 </li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git rebase ]]></title>
            <link>https://velog.io/@lets_gojae/Git-rebase</link>
            <guid>https://velog.io/@lets_gojae/Git-rebase</guid>
            <pubDate>Sun, 01 Nov 2020 06:06:52 GMT</pubDate>
            <description><![CDATA[<h1 id="rebase-하기">Rebase 하기</h1>
<p>Git에서 한 브랜치에서 다른 브랜치로 합치는 방법으로는 두 가지가 있다. 하나는 Merge 이고 다른 하나는 Rebase 다.</p>
<ol>
<li>마스터에서 업데이트가 되었을 때 - 마스터로 이동 후 git pull origin master </li>
<li>로컬 브랜치로 이동 후 git rebase -i master &gt; 1개를 제외한 나머지 squash</li>
<li>충돌 해결 후 git add &gt; git rebase -continue </li>
<li>push 할 때는 git push origin feature/main -f </li>
</ol>
<p>만약 돌이킬 수 없는 상황이 왔을 때 push / pull 할 때는 commit을 남겨야 하니 그 시점으로 돌아가기 위해서는 git reflog로 모든 커밋 내용을 볼 수 있고 돌아가고 싶은 커밋내용을 선택해서 git reset -hard 커밋넘버</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] React - Redux ]]></title>
            <link>https://velog.io/@lets_gojae/TIL-React-Redux</link>
            <guid>https://velog.io/@lets_gojae/TIL-React-Redux</guid>
            <pubDate>Sun, 11 Oct 2020 14:34:01 GMT</pubDate>
            <description><![CDATA[<h1 id="기본-개념">기본 개념</h1>
<ul>
<li><strong>액션(Action)</strong>: 상태를 어떻게 변경시킬지 추상화한 표현힙니다. 단순 객체(Plain object)로 <code>type</code>프로퍼티를 꼭 가지고 있어야 합니다.</li>
<li><strong>리듀서(Reducer)</strong>: 애플리케이션의 다음 상태를 반환하는 함수입니다. 이전 상태와 액션을 받아 처리하고 다음 상태를 반환합니다.</li>
<li><strong>스토어(Store)</strong>: 애플리케이션의 상태를 저장하고 읽을 수 있게 하며 액션을 보내거나 상태의 변화를 감지합니다.</li>
</ul>
<h1 id="redux의-3원칙">Redux의 3원칙</h1>
<h2 id="하나의-소스로부터">하나의 소스로부터</h2>
<p>모든 상태는 하나의 스토어 안에서 하나의 객체 트리 구조로 저장됩니다.
<img src="https://images.velog.io/images/lets_gojae/post/fa62e334-e49d-4e8d-b448-385d446759b0/1_7ZtL4LfjoHphoZFRN_ZPaQ.gif" alt="">
<a href="https://medium.com/@wooder2050/%EB%A6%AC%EB%8D%95%EC%8A%A4-redux-%EB%8A%94-%EC%99%9C-%EC%93%B0%EB%8A%94-%EA%B1%B4%EB%8D%B0-2eaafce30f27">이미지 : Redux가 필요하다는 것을 언제 알 수 있나요?</a>.
상태의 변경은 Reducer를 통해 반환하고 그 데이터를 스토어에 저장합니다.
React에서는 부모 컴포넌트에서 자식 컴포넌트에서 상태를 넘기지만, Redux에서는 하나의 스토어에서 관리합니다.
-스토어를 여러개 만들 수도 있습니다.-</p>
<h2 id="상태는-읽기-전용">상태는 읽기 전용</h2>
<p>상태를 변화시키는 방법은 액션 객체를 통해 전당하는 방법뿐입니다.
Reducer 이외의 공간에서 상태는 읽기모드입니다.</p>
<h2 id="변화는-순수-함수로-작성-되어야합니다">변화는 순수 함수로 작성 되어야합니다.</h2>
<p>액션에 의해 상태 트리가 어떻게 변화하는 지는 순수 Reducer를 작성해야 합니다.</p>
<h3 id="순수-함수란">순수 함수란?</h3>
<ul>
<li>함수가 실행되는 곳이 어디든, 언제든 외부의 상태를 변경하지 않으면서 동일한 입력값에는 동일한 결과값을 반환해야 합니다.</li>
</ul>
<p>Reducer는 2가지 특징을 갖는데 </p>
<ul>
<li>Reducer는 반드시 이전의 상태와 Action을 매개변수(잆력값)로 받습니다.</li>
<li>Reducer는 결과값으로 이전의 데이터를 변경시키지 않고 새로운 데이터(객체)를 만들어 반환합니다.</li>
</ul>
<h2 id="redux의-장점">Redux의 장점</h2>
<p>데이터가 <strong>집중화(Centralized)</strong>되어 있어서 <strong>예측 가능하며(Predictable)</strong>데이터 흐름이 단방향이라서 디버깅하기 쉽습니다(Debuggable). 필요에 맞게 <strong>유연하게(Flexible)</strong> 구현 할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] spread와 rest 문법 ]]></title>
            <link>https://velog.io/@lets_gojae/TIL-spread%EC%99%80-rest-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@lets_gojae/TIL-spread%EC%99%80-rest-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Sun, 11 Oct 2020 08:21:57 GMT</pubDate>
            <description><![CDATA[<h1 id="spread">Spread</h1>
<p>spread라는 단어는 퍼뜨리다, 펼치다 라는 의미입니다. 
객체 혹은 배열을 펼칠 수 있습니다.</p>
<p><img src="https://images.velog.io/images/lets_gojae/post/d2666352-1413-4198-adba-4641323eeba2/image.png" alt=""></p>
<p>위 코드의 핵심은 기존의 것을 던들이지 않고, 새로운 객체를 만든다는 것 입니다. 이러한 상황에서 사용 할 수 있는 문법이 spread입니다.</p>
<p><img src="https://images.velog.io/images/lets_gojae/post/ac3fdff9-f956-413c-acb4-e79a8afa353d/image.png" alt=""></p>
<h2 id="배열에서의-spread">배열에서의 spread</h2>
<p>spread 연산자는 배열에서도 사용 할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/lets_gojae/post/2e02b8a4-e7ba-42d4-a5d2-7187a808a578/image.png" alt=""></p>
<h1 id="rest">rest</h1>
<p>rest는 spread랑 비슷한데, 역할이 다릅니다.
rest는 객체, 배열, 그리고 함수의 파라미터에서 사용이 가능합니다.</p>
<p><img src="https://images.velog.io/images/lets_gojae/post/26eba33e-d4fe-4819-8dd3-3be77998a013/image.png" alt=""></p>
<p>rest는 객체와 배열에서 사용 할 떄는 비구조화 할당과 함께 사용합니다. 주로 rest라는 키워드를 사용하는데 추출한 값의 이름이 꼭  rest 일 필요는 없습니다.
<img src="https://images.velog.io/images/lets_gojae/post/5f10703a-8b18-4e07-9a47-753a5d080e93/image.png" alt=""></p>
<h2 id="배열에서의-rest">배열에서의 rest</h2>
<p><img src="https://images.velog.io/images/lets_gojae/post/985de196-aecb-4b72-a841-b8b15b9186ed/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] useRef로 DOM 선택하기]]></title>
            <link>https://velog.io/@lets_gojae/TIL-API-%EC%97%B0%EB%8F%99</link>
            <guid>https://velog.io/@lets_gojae/TIL-API-%EC%97%B0%EB%8F%99</guid>
            <pubDate>Sat, 10 Oct 2020 16:00:30 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>JavaScript를 사용 할 떄에는, 우리가 특정 DOM을 선택해야 하는 상황에 
<code>getElementById</code>, <code>querySelector</code> 같은 DOM Selector 함수를 사용해서 DOM을 선택합니다 
<br>
React에서 엘리먼트 크기를 가져올 때 , 스크롤바 위치를 가져올 때 <code>ref</code>라는 것을 사용합니다.
함수형 컴포넌트에서 <code>useRef</code>라는 Hook 함수를 사용합니다. </p>
</blockquote>
<p><img src="https://images.velog.io/images/lets_gojae/post/955acd04-f2f8-4c6b-aef0-431e475935d9/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/lets_gojae/post/aa0b5a36-e602-4064-836f-d2bc0ef04f7a/image.png" alt=""></p>
<p>useRef()를 사용하여 Ref객체를 만들고, 이 객체를 우리가 선택하고 싶은 DOM에 ref 값을 설정해주어야 합니다. 그러면 Ref객체의 <code>.current</code> 값은 원하는 DOM을 가르키게 됩니다.</p>
<p><code>onReset</code>함수에서 input에 포커스를 하는 <code>focus()</code> DOM API를 호출해주었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] React Hooks- Using the Effect Hook]]></title>
            <link>https://velog.io/@lets_gojae/TIL-React-Hooks-Using-the-Effect-Hook</link>
            <guid>https://velog.io/@lets_gojae/TIL-React-Hooks-Using-the-Effect-Hook</guid>
            <pubDate>Sun, 04 Oct 2020 09:58:26 GMT</pubDate>
            <description><![CDATA[<h2 id="effect-hook-사용하기">Effect Hook 사용하기</h2>
<p><img src="https://images.velog.io/images/lets_gojae/post/f83dbec0-1d0f-4d57-bb5a-dd29bbcf823b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.49.24.png" alt=""></p>
<p>데이터 가져오기, 구독(subscription) 설정하기, 수동으로 리액트 컴포넌트의 DOM을 수정하는 것까지 이 모든 것이 side effects입니다. </p>
<blockquote>
</blockquote>
<p>리액트의 class 생명주기 메서드에 친숙하다면, useEffect Hook을 componentDidMount와 componentDidUpdate, componentWillUnmount가 합쳐진 것으로 생각해도 좋습니다.</p>
<h2 id="clean-up를-이용하지-않는-effects">Clean-up를 이용하지 않는 Effects</h2>
<h3 id="class를-사용하는-예시">Class를 사용하는 예시</h3>
<p>class 컴포넌트에서 render 메서드에서는 side effect를 발생시키지 않습니다. 이러한 effect를 수행하는 것은 리액트가 DOM을 업데이트하고 난 이후입니다.
리액트 class에서 side effect를 componentDidMount와 componentDidUpdate에 두는 것이 바로 이 때문입니다.
<img src="https://images.velog.io/images/lets_gojae/post/34a155b4-3d73-431d-9440-4f531bcaa9d7/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.03.22.png" alt=""></p>
<p>class컴포넌트 안에 두 개의 라이프사이클 메서드가 중복되는 것을 주의해야 합니다. 컴포넌트가 마운트된 단계인지 아니면 업데이트되는 것인지에 상관없이 같은 side effect를 실행되기 때문입니다. 개념적으로 렌더링 이후에는 항상 같은 코드가 수행되기를 바지만, 리액트 클래스 컴포넌트는 그런 메서드를 가지고 있지 않습니다. </p>
<h3 id="hook을-이용하는-예시">Hook을 이용하는 예시</h3>
<p><img src="https://images.velog.io/images/lets_gojae/post/13435e10-d9e1-4e24-84a6-3b5da8d9957a/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.39.53.png" alt=""></p>
<h2 id="useeffect가-하는-일">useEffect가 하는 일</h2>
<p>useEffect Hook을 이용하여 컴포넌트가 렌더링 이후에 어떤 일을 하는 지를 말합니다. 리액트는 우리가 넘긴 함수를 기억했다가(이 함수를 ‘effect’라고 부릅니다) DOM 업데이트를 수행한 이후에 불러낼 것입니다. effect를 통해 문서 타이틀을 지정하지만, 데이터를 가져오거나 다른 명령형(imperative) API를 불러내는 일도 할 수 있습니다.</p>
<h2 id="useeffect를-불러내는-이유">useEffect를 불러내는 이유</h2>
<p>useEffect를 컴포넌트 내부에 둠으로써 effect를 통해 count state 변수(또는 그 어떤 prop에도)에 접근할 수 있게 됩니다. 함수 범위 안에 존재하기 때문에 특별한 API 없이도 값을 얻을 수 있는 것입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] React Hooks  - React Hooks / State Hook 사용하기]]></title>
            <link>https://velog.io/@lets_gojae/TIL-React-React-Hooks%EC%9D%98-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@lets_gojae/TIL-React-React-Hooks%EC%9D%98-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Wed, 30 Sep 2020 14:32:39 GMT</pubDate>
            <description><![CDATA[<h1 id="div-stylecolor00a5ffreact-개요div"><div style=color:#00A5FF>React 개요</div></h1>
<p>Hook을 이용해서 Class 작성할 필요 없이 상태 값과 여러 React의 기능을 사용할 수 있습니다.</p>
<h2 id="div-stylecolor00a5ff소개영상div"><div style=color:#00A5FF>소개영상</div></h2>
<p>Ryan Florence가 Hook를 사용하여 어<del>텍스트</del>떻게 애플리케이션을 리팩토링 할 것인지 보여주었습니다. 
!youtube[dpw9EHDh2bM]</p>
<h2 id="div-stylecolor00a5ffhook의-장점div"><div style=color:#00A5FF>Hook의 장점</div></h2>
<ul>
<li>함수형 컴포넌트에서는 원하는 기능을 함수로 만든 후 필요한 곳에 넣어주기만 하면 되기 때문에 로직의 재사용이 유연해 집니다.</li>
<li>클래스형 컴포넌트가 가지고 있던 복잡함과 , 재사용성의 단점들까지 보안 해줍니다.</li>
<li>class형 컴포넌트의 이벤트에서 Props를 재사용 하면서 문제가 발생하는데 함수형 컴포넌트는 이런 문제를 발생하지 않습니다.</li>
<li>라이프 사이틀 매서드가 다양하여 코드가 복잡해 지면서 테스트도 어려워 집니다. 이를 해결하기 위해 Effect Hook이 축가가 되었는데 Effect Hook은 componentDidMount, conponentDidUpdate, componentWiilUnmount를 대체할 수 있습니다.</li>
</ul>
<h2 id="div-stylecolor00a5ffstate-hook-사용하여-비교하기div"><div style=color:#00A5FF>State Hook 사용하여 비교하기</div></h2>
<h3 id="hook과-같은-기능을-하는-클랭스형-컴포넌트">Hook과 같은 기능을 하는 클랭스형 컴포넌트</h3>
<p><img src="https://images.velog.io/images/lets_gojae/post/9584c24e-7748-49d2-9939-0e4ba92bbcea/HOOKS.png" alt="">
<code>state는 { count: 0 }</code> 이며 사용자가 <code>this.setState.()</code>룰 호출하는 버튼을 클릭했을 때 <code>state 값인 count</code>를 증가시킵니다. </p>
<h3 id="함수형-컴포넌트">함수형 컴포넌트</h3>
<p><img src="https://images.velog.io/images/lets_gojae/post/2fde4fae-f60a-44e6-82ec-54149e2335fe/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-30%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.43.45.png" alt="">
 <code>const [count, setCount] = useState(0);</code>에서
<code>count</code>는 class형 컴포넌트에서 <code>state = count</code>이고, 
<code>setCount</code>는 class형 컴포넌트에서 <code>this.setState</code>입니다.
<img src="https://images.velog.io/images/lets_gojae/post/426d8b52-af52-4ccb-bea5-9ece7fe92d1a/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-30%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.15.19.png" alt="">
<code>setCount</code>자리는 꼭 <code>setCount</code>라고 안해도 됩니다. </p>
<hr>
<p>아래와 같이 똑같은 출력을 할 수 있는 것을 볼 수 있습니다.
<img src="https://images.velog.io/images/lets_gojae/post/eddd0ca0-dc7e-41ec-b6f4-6ac4fc63885e/%E1%84%92%E1%85%AA%E1%84%86%E1%85%A7%E1%86%AB%E1%84%80%E1%85%B5%E1%84%85%E1%85%A9%E1%86%A8.gif" alt="">
useState를 사용 할 때에서는 파라미터로 넣어서 호출 할 수 있습니다.
<img src="https://images.velog.io/images/lets_gojae/post/524eab36-29d3-4708-8df2-c83454a0db3c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-30%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.07.38.png" alt="">
<img src="https://images.velog.io/images/lets_gojae/post/56e872cc-f32f-4f67-b46e-6e9f6b36169a/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-30%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.10.09.png" alt=""></p>
<hr>
<p><img src="https://images.velog.io/images/lets_gojae/post/f19ac556-ffd5-4273-bc4f-0fffcd841565/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-30%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.11.46.png" alt="">
<img src="https://images.velog.io/images/lets_gojae/post/3c44d0c0-31a4-4ca6-ab38-4438b236fea9/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-30%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.12.24.png" alt=""></p>
<hr>
<div style=font-size:15px>
더 자세하고 명확한 예시를 보여드리고 싶었으나 Hooks와 Class의 차이점을 명확하게 알지 못해 남의 경험을 가져와서 사용을 하였습니다. 하지만 구글링을 통해서 라이프 사이클 매서드가 얼마나 simple 해졌는지, class형 컴포넌트 보다 함수형 컴포넌트가 가독성이 훨씬 뛰어나다는 것을 느꼈습니다.
</div>
]]></description>
        </item>
        <item>
            <title><![CDATA[wecode 1차 프로젝트를 마치며]]></title>
            <link>https://velog.io/@lets_gojae/wecode-1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EB%A7%88%EC%B9%98%EB%A9%B0</link>
            <guid>https://velog.io/@lets_gojae/wecode-1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EB%A7%88%EC%B9%98%EB%A9%B0</guid>
            <pubDate>Sun, 27 Sep 2020 15:35:25 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/lets_gojae/post/02deaded-aca3-450a-b109-55063b73d7cb/image.png" alt=""></p>
<h1 id="프로젝트-개요">프로젝트 개요</h1>
<p>clone 프로젝트로 Logitech 미국 사이트를 선정 했습니다.
&quot;<a href="https://www.logitech.com/en-us&quot;">https://www.logitech.com/en-us&quot;</a>
<img src="https://images.velog.io/images/lets_gojae/post/06999177-cede-4db6-bf69-ff5f441019f6/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-27%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.16.05.png" alt=""></p>
<h2 id="공통-목표">공통 목표</h2>
<ul>
<li>Trello 와 같은 tool을 활용하여 프로젝트를 진행 했습니다.</li>
<li>Standup Meeting을 매일 아침 미팅을 통해 진행 사항과 오늘 할 일을 공유 했습니다.</li>
<li>Communication을 팀원들과 올바른 방법으로 의견을 주고 받으며 조율했습니다.</li>
<li>Git의 기본적인 Flow에 따라 Git을 사용할 수 있고, branch를 생성하고 올바른 이름과 내용을 commit message를 작성했습니다.</li>
</ul>
<h2 id="프로젝트에-사용된-기술">프로젝트에 사용된 기술</h2>
<p>프론트엔드: ReactJs, Sass
백엔드: Django, MySQL
배포 : AWS
소스관리:git, github</p>
<h2 id="프로젝트-인원-구성">프로젝트 인원 구성</h2>
<p>프론트앤드 - 4명
백앤드 - 2명</p>
<p>프론트엔드 개발자로 참여하여
Main 페이지 그리고 nav 바 담당을 했습니다.</p>
<h2 id="프로젝트-구현">프로젝트 구현</h2>
<p><img src="https://images.velog.io/images/lets_gojae/post/3c39a9b7-ee00-46b9-a1d8-d2a806258615/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-27%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.37.06.png" alt=""></p>
<p><img src="https://images.velog.io/images/lets_gojae/post/a1fb5e80-da0b-4bd3-bf6a-362c0500da8f/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-27%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.39.52.png" alt=""><img src="https://images.velog.io/images/lets_gojae/post/04cd3e18-a382-468a-abf3-5c0aee3e96dc/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-27%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.40.24.png" alt=""></p>
<h2 id="프로젝트를-마치고">프로젝트를 마치고</h2>
<p>처음 프로젝트를 시작할 때 내가 해낼 수 있을까? 라는 생각을 많이 했다. 팀에 민폐가 되지 않을까? 라는 생각을 매일 했고, 매일 그 생각을 가지고 열심히 했지만 열심히 한게 열심히가 아니었다. 내가 무엇이 잘못되었는가를 생각했다. 공부를 하는 방법, 프로젝트의 큰 틀을 보지 못한 점, 부족한 점이 많다.</p>
<p>지금이라도 열심히 공부하고 내가 무엇이 부족한지 스스로 인지하면서 공부를 하자. 늦지 않았고 스스로 가능성이 있다고 생각한다. 지금은 아니지만 열심히 해서 같이 일하고 싶은 사람이 되자. </p>
<p>첫 프로젝트인 만큼 서로 어색하게 시작해서 지금까지 큰 일 없이 마무리 해주신 우리 팀원에게 감사합니다. 처음이자 마지막이 될 수도 있는 프로젝트 같이 할 수 있어서 영광이였습니다.😎</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] React 입문 (with fetch ) - 2]]></title>
            <link>https://velog.io/@lets_gojae/TIL-React-%EC%9E%85%EB%AC%B8-with-fetch-2</link>
            <guid>https://velog.io/@lets_gojae/TIL-React-%EC%9E%85%EB%AC%B8-with-fetch-2</guid>
            <pubDate>Sun, 20 Sep 2020 07:25:08 GMT</pubDate>
            <description><![CDATA[<h2 id="fetch함수---resjson의-의미">fetch()함수 - res.json()의 의미</h2>
<pre><code>fetch(&#39;https://api.google.com/user&#39;, {
    method: &#39;post&#39;,
    body: JSON.stringify({
        name: &quot;yeri&quot;,
        batch: 1
    })
  })
  .then(res =&gt; res.json())   // 왜 then이 두개고 res.json() 은 뭔지?
  .then(res =&gt; {
    if (res.success) {
        alert(&quot;저장 완료&quot;);
    }
  })</code></pre><p>첫 번째 then의 res가 어떤 값이 들어올 때 리턴하는가? console.log를 찍어봅니다.</p>
<pre><code>fetch(&#39;https://api.google.com/user&#39;, {
    method: &#39;post&#39;,
    body: JSON.stringify({
        name: &quot;yeri&quot;,
        batch: 1
    })
  })
  .then(res =&gt; {       // 첫 번째 then
    console.log(res);  // 어떤 값이 나오는지 확인해보세요. 실제 잘 작동하는 api 주소가 필요합니다.

    return res.json();
  })
  .then(res =&gt; {       // 두 번째 then
    if (res.success) {
        alert(&quot;저장 완료&quot;);
    }
  })</code></pre><h2 id="fetch함수---첫-번째-then-함수에-추가되는-로직">fetch()함수 - 첫 번째 then 함수에 추가되는 로직</h2>
<p><code>fetch()</code> <code>.then()</code> <code>.then()</code>형태만 있었지만 백앤드에서 응당 body를 안 주는 경우도 많습니다.
응답 body로 JSON 데이터를 주지 않는데 프론트에서 Reaponse Object의 json()을 호출하면 에러가 납니다.</p>
<blockquote>
<pre><code>설명: 유저를 저장한다.
base url: https://api.google.com
endpoint: /user
method: post
요청 body:
    {
        &quot;name&quot;: string,
        &quot;batch&quot;: number
    }
응답 body:
    1. 제대로 저장했으면 status code를 200 전달. 응답 body는 없음
    2. 권한 오류가 생기면 status code를 403으로 전달하고. 응답 body는 아래와 같음
        {
            success: false,
            message: &quot;권한이 없습니다&quot;
        }</code></pre></blockquote>
<pre><code>
위의 상황일 때 fetch()를 구현하는 방법

&gt;```
fetch(&#39;https://api.google.com/user&#39;, {
    method: &#39;post&#39;,
    body: JSON.stringify({
        name: &quot;yeri&quot;,
        batch: 1
    })
  })
  .then(res =&gt; {
    if (res.status === 200) {
        alert(&quot;저장 완료&quot;);
    } else if (res.status === 403) {
        return res.json();
    }
  })
  .then(res =&gt; {
    console.log(&quot;에러 메시지 -&gt;&quot;, res.message);
  })
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] React 입문 (with fetch ) - 1]]></title>
            <link>https://velog.io/@lets_gojae/TIL-React-%EC%9E%85%EB%AC%B8-with-fetch</link>
            <guid>https://velog.io/@lets_gojae/TIL-React-%EC%9E%85%EB%AC%B8-with-fetch</guid>
            <pubDate>Sun, 20 Sep 2020 07:15:14 GMT</pubDate>
            <description><![CDATA[<h1 id="fetch-함수">fetch() 함수</h1>
<p>백앤드로부터 데이터를 받아오려면 api를 호출하고 데이터를 응답받습니다.
이 때 자바스크립트 Web API fetch 함수를 사용합니다.</p>
<h2 id="fetch-함수-기본">fetch() 함수 기본</h2>
<p><strong>fetch() 화살표 함수 선언식</strong>  </p>
<pre><code>fetch(&#39;api 주소&#39;)
  .then(res =&gt; res.json())
  .then(res =&gt; {
    // data를 응답 받은 후의 로직
  });</code></pre><p><strong>fetch() 함수 선언식</strong>    </p>
<pre><code>fetch(&#39;api 주소&#39;)
  .then(function(res) {
    return res.json();
  })
  .then(function(res) {
    // data를 응답 받은 후의 로직
  });</code></pre><h2 id="fetch함수---method가-get인-경우">fetch()함수 - method가 get인 경우</h2>
<p>fetch() 함수에서 default method는 get입니다. </p>
<pre><code>설명: 유저 정보를 가져온다.
base url: https://api.google.com
endpoint: /user/3
method: get
응답형태:
    {
        &quot;success&quot;: boolean,
        &quot;user&quot;: {
            &quot;name&quot;: string,
            &quot;batch&quot;: number
        }
    }</code></pre><p><strong>호출 시</strong></p>
<pre><code>fetch(&#39;https://api.google.com/user/3&#39;)
  .then(res =&gt; res.json())
  .then(res =&gt; {
    if (res.success) {
        console.log(`${res.user.name}` 님 환영합니다);
    }
  });</code></pre><p><strong>리액트에서 사용 시</strong></p>
<pre><code>import React, { Component } from &#39;react&#39;;

class User extends Component {
  componentDidMount() {
    // user id가 props를 통해 넘어온다고 가정
    const { userId } = this.props;

    fetch(`https://api.google.com/user/${userId}`)
      .then(res =&gt; res.json())
      .then(res =&gt; {
        if (res.success) {
            console.log(`${res.user.name}` 님 환영합니다);
        }
      });
  }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] HTML/CSS 입문 (with flex-grid)]]></title>
            <link>https://velog.io/@lets_gojae/TIL-HTMLCSS-%EC%9E%85%EB%AC%B8-with-flex-grid</link>
            <guid>https://velog.io/@lets_gojae/TIL-HTMLCSS-%EC%9E%85%EB%AC%B8-with-flex-grid</guid>
            <pubDate>Sat, 19 Sep 2020 09:20:29 GMT</pubDate>
            <description><![CDATA[<h1 id="flex박스">flex박스</h1>
<p>flex는 두 가지 요소로 이루워져 있습니다.</p>
<p><strong>flex container</strong>은 flex itex을 포함한 부모 역할을 합니다.
박사가 늘어나는 방향(<code>flex-direction</code>)과 박스가 다음 줄로 넘어가는 방식 (<code>flex-wrap</code>)을 정합니다. flex 아이템을 정렬(<code>align-item</code>, <code>justify-content</code>)하는 것이 flex container의 역할입니다.</p>
<p><strong>flex item</strong>은 flex container 안에 위치하면서 박스 하나 하나의 모양을 결정합니다. 박스의 크기(<code>flex-basis</code>)와 그 크기가 변경되는 방식(<code>flex-grow</code>, <code>flex-shrink</code>)을 정의 할 수 있습니다.</p>
<h1 id="그리드-레이아웃-만들기">그리드 레이아웃 만들기</h1>
<h2 id="행row">행(row)</h2>
<p>먼저 <code>.row</code>클래스로 flex container를 정희합니다. <code>display</code>속성에 <code>flex</code>값을 사용하면 flex container를 만들 수 있습니다.</p>
<pre><code>.row {
    display: flex;
}</code></pre><p>flex container는 안에 요소가 늘어나면 한 줄로 늘여 세웁니다.
자식 요소가 다음 줄로 넘어가는 것은 <code>flex-wrap</code>속성입니다.</p>
<pre><code>.row {
    display: flex;
    flex-wrap: wrap;
}</code></pre><p>플렉스 컨테이너 안에 있는 요소가 늘어나 컨테이너 너비를 넘어가면 다음 줄로 배치합니다. </p>
<h2 id="열column">열(column)</h2>
<p><code>.row</code>가 flex container 였다면 <code>.col</code>은 자식 요소인 flex item으로 만들어 볼 수 있씁니다. 행이 열을 포함하듯 flex container가 flex item을 포함하니까 중첩 구조가 맞습니다.</p>
<p>flex container의 자식요소는 자동으로 flex item이 되는데 기본적으로 자식요소는 컨텐츠 크기만큼 공간을 할당합니다. 열을 행에 꽉 차게 만들고 싶을 때 <code>flex-grow</code>속성을 이용합니다.</p>
<p><code>flex-grow</code>는 flex item이 flex container 안에서 차지하는 크기의 정도를 나타내는데 기본값이 0입니다. 1로 설정하면 컨테이너의 크기만큼 꽉찬 아이템을 그릴 수 있습니다.</p>
<pre><code>.col {
    flex-basis: 0;
    flex-grow: 1;
}</code></pre><p>아이템 크기를 지정할 수도 있어야 하는데 <code>flex-basis</code>속성을 사용합니다. 아이템의 초기 크기를 지정하는데 이것을 50% 값으로 설정하면 부모인 flex container 너비의 절반인 크기를 갖습니다.</p>
<pre><code>.col-6 {
    flex-grow: 0;
    flex-shrink: 0;
    flex-basis: 50%;
}</code></pre><p><code>flex-basis</code>아이템 크기를 지정했다면 늘어나는 정도를 정하는 <code>flex-grow</code>와 <code>flex-shrink</code>속성의 값을 0으로 주어 변동되지 않도록 고정해야합니다.</p>
<p>.col-6 {
    flex: 0 0 50%;
}</p>
<p>아이템 크기와 관련된 이 세 개 속성은 하나의 축약 표현을 많이 사용하는데 <code>flex</code>속성에 <code>flex-grow</code>, <code>flex-shrink</code>, <code>flex-basis</code>값을 순서대로 지정합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] React 입문 (with Stack & Queue)]]></title>
            <link>https://velog.io/@lets_gojae/TIL-React-%EC%9E%85%EB%AC%B8-with-Stack-Queue</link>
            <guid>https://velog.io/@lets_gojae/TIL-React-%EC%9E%85%EB%AC%B8-with-Stack-Queue</guid>
            <pubDate>Sat, 12 Sep 2020 11:50:54 GMT</pubDate>
            <description><![CDATA[<h1 id="stack">Stack</h1>
<p><strong>LIFO (Last in First Out)</strong>
마지막으로 들어온 데이터가 가장 먼저 나갑니다.
<img src="https://images.velog.io/images/lets_gojae/post/86785a20-9eea-4781-9fe4-c176ca192c53/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-12%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.45.30.png" alt=""></p>
<p>아이스크림의 콘 위에 쌓이는 것도 스택<img src="https://images.velog.io/images/lets_gojae/post/871b2f9c-7f48-4eec-922e-e5871115150c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-12%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.46.33.png" alt="">
책들을 쌓아두는 것도 스택</p>
<h1 id="queue">Queue</h1>
<p><strong>FIFO (First In First Out)</strong>
처음으로 들어온 데이터가 가장 먼저 나갑니다.</p>
<p><img src="https://images.velog.io/images/lets_gojae/post/319cba5a-edbc-4d1c-a3c9-2d2afaff9d0f/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-12%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.49.10.png" alt="">
마트에서 장을 볼 때, 버스를 기다릴 때, 모두 큐에 들어간 데이터와 같습니다. 가장 먼저 들어온 데이터가 먼저 처리됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Westagram 프로젝트를 마치며]]></title>
            <link>https://velog.io/@lets_gojae/Westagram-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EB%A7%88%EC%B9%98%EB%A9%B0</link>
            <guid>https://velog.io/@lets_gojae/Westagram-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EB%A7%88%EC%B9%98%EB%A9%B0</guid>
            <pubDate>Sat, 12 Sep 2020 10:57:55 GMT</pubDate>
            <description><![CDATA[<p>웹 개발자가 되기 위해 위코드를 들어온지 벌써 4주차가 끝났습니다.
HTML부터 React까지 필요한 모든 기초적인 개념을 배웠고, Westagram을 마쳤습니다.</p>
<h1 id="주차별-세션-스케줄">주차별 세션 스케줄</h1>
<blockquote>
<p><strong>1주차</strong> </p>
</blockquote>
<ul>
<li>웹 서비스의 역사와 발전</li>
<li>Linux &amp; Termainal</li>
<li>프론트엔드 개발자가 하는 일</li>
<li>개발자 도구</li>
<li>[Replit] HTML,CSS, JavaScript</li>
</ul>
<hr>
<blockquote>
<p><strong>2주차</strong></p>
</blockquote>
<ul>
<li>HTTP</li>
<li>Database</li>
<li>Git &amp; GitHub</li>
<li>Westagram 시작</li>
</ul>
<hr>
<blockquote>
<p><strong>3주차</strong></p>
</blockquote>
<ul>
<li>[React] Router, Sass</li>
<li>[React] state, Props, Event</li>
<li>[React] 팀 프로젝트</li>
</ul>
<hr>
<blockquote>
<p><strong>4주차</strong></p>
</blockquote>
<ul>
<li>Stack &amp; Queue</li>
<li>인증 &amp; 인가</li>
<li>로그인 &amp; 회원가입</li>
<li>[React] Mock Data 활용법</li>
<li>[React] Westagram - 마무리</li>
<li>[React] Monsters 과제</li>
</ul>
<p>Westagram은 위 개념들을 하나하나 적용해가면서 다시 곱씹을 수 있는 프로젝트 였습니다. 기본 적인 개념들을 완벽하게 이해를 하지 못한 상태에서 프로젝트를 시작하니 많은 어려움이 있고, 그 어려움이 있어서 짧지만 굵은 4주 동안 많은 성장과 나를 다시 뒤돌아보는 시간이 많았습니다.</p>
<h1 id="주요-기능">주요 기능</h1>
<ol>
<li>login page / main page 컴포넌트화</li>
<li>id, password 인풋에 setstate 기능으로 state값에 value전달</li>
<li>버튼 클릭시 main 페이지 이동</li>
<li>메인 페이지 및 로그인 페이지 componenet화(nav, feedline)</li>
<li>Array map()활용</li>
<li>mock data 활용</li>
</ol>
<h1 id="react를-배우고-느낀-점">React를 배우고 느낀 점</h1>
<p>React의 컴포넌트 구조는 계층으로 구성되어 있고 용도에 맞추어 컴포넌트와 모듈을 구별하여 프로젝트를 진행 할 수 있었습니다. 전체적인 가독성이 높아지고 컴포넌트를 쉽게 재사용 할 수 있어서 React의 강점이 느껴졌습니다.
컴포넌트화로 인해 쉽게 레이아웃이 어떻게 구성 되어 있는지 쉽게 알아 볼 수 있었습니다. 그리고 반복적으로 코드를 작성하지 않고 Array.map기능으로 쉽게 구현할 수 있었습니다. </p>
<hr>
<p>아직 많은 기본적인 개념들을 잘 이해하지 못하고 있는 것이 스스로도 느끼고 있지만, 하루하루 조금 씩 성장해가는 제 자신도 동시에 느껴지고 있습니다.</p>
<h1 id="git을-이용한-팀-프로젝트">git을 이용한 팀 프로젝트</h1>
<p>협업을 통해 진행했던 프로젝트에서 공통으로 쓰이는 컴포넌트와 reset.scss와 common.scss를 사용하니 merge할 때 conflict가 발생하고 팀원들과 서로 비교를 하면서 소통하고 풀었을 때 색다른 경험을 느꼈고 git 협업을 통해 소통의 중요성을 다시 한 번 느꼈습니다.</p>
<h1 id="인상-깊었던-코드">인상 깊었던 코드</h1>
<p><img src="https://images.velog.io/images/lets_gojae/post/37937627-f3c3-4776-8607-3db1e2f6040e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-09-12%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.29.18.png" alt="">
백앤드로부터 데이터를 받아오려면 api를 호출하고 데이터를 응닫을 받습니다. 지금은 Mock Data를 활용해 데이터를 받아왔지만, back과 front와의 첫 만남이였습니다.</p>
<h1 id="부족한-점">부족한 점</h1>
<ol>
<li>기본적으로 필요한 개념들을 많이 이해를 못하고 있는 점</li>
<li>계획적으로 하지 않는 점</li>
<li>내가 직접 짠 코드가 아니고 다른 분의 코드를 보고 따라한 점 (그 코드를 이해하고 분석하려는 시도는 나에게 위안을 심어준다.</li>
</ol>
<p>부족한 점은 많지만, 완벽이라는 것은 없기에 완벽에 가까운 사람이 되기 위해 노력하자.</p>
<h1 id="4주간-느꼈던-감정들">4주간 느꼈던 감정들...</h1>
<p>위코드를 다니면서 정말 많은 생각을 하게 됐고 동기들을 통해 내 자신을 다시 뒤돌아보는 계기가 너무나 많았다. 앞으로의 미래를 생각해서 안좋은 습관들을 스스로 인지하여 천천히 고쳐나가는 습관을 길러야 한다. 내 스스로 열심히 하고 있다고 위안을 얻지만 그것은 여태껏 내가 해왔던 것에 비교해서이다. </p>
<p>사람들에게 편하게 다가가질 못한다 낯가림을 극복하도록 노력이라도 하자. 내가 먼저 다가가야 나에게 다가온다. </p>
<p>항상 겸손하고 배려하고 무례하지 말자.</p>
]]></description>
        </item>
    </channel>
</rss>