<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Tunnel Vision.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 02 Sep 2021 09:06:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Tunnel Vision.log</title>
            <url>https://images.velog.io/images/bu_du_dak/profile/d5baaac5-7609-4d6b-97f7-ec7ea43cf082/logo.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Tunnel Vision.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bu_du_dak" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[ReactNative-UI]]></title>
            <link>https://velog.io/@bu_du_dak/ReactNative-UI</link>
            <guid>https://velog.io/@bu_du_dak/ReactNative-UI</guid>
            <pubDate>Thu, 02 Sep 2021 09:06:54 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/bu_du_dak/post/539687f1-2b91-4b5c-9a25-ff8dfc6f3ac9/reactNativeLogo.png" alt=""></p>
<h2 id="📌-reactnative-에서의-ui">📌 ReactNative 에서의 UI</h2>
<h3 id="🕹-style">🕹 style</h3>
<p><code>ReactNative</code> 의 스타일은 <code>StyleSheet.create</code> 메서드를 사용해 컴포넌트에 style props를 전달하는 방식을 사용한다.</p>
<p>따라서, 문법 규칙이 자바스크립트 object 작성시와 동일하다. </p>
<blockquote>
</blockquote>
<p>예를 들어 글씨 사이즈와 색을 바꿔주는 스타일을 적용 시키려 할때, </p>
<blockquote>
</blockquote>
<pre><code class="language-js">const styles = StyleSheet.create({
  MyFont: {
    fontSize: 30,
    color: &#39;red&#39;
  }
})</code></pre>
<blockquote>
</blockquote>
<p><code>StyleSheet.create</code> 로 만든 <code>MyFont</code> 를</p>
<blockquote>
</blockquote>
<pre><code class="language-js">&lt;View&gt;
  &lt;Text style={styles.MyFont}&gt; 안녕하세요 &lt;/Text&gt;
&lt;/View&gt;</code></pre>
<p>형식으로 전달해주면 된다.</p>
<blockquote>
</blockquote>
<h4 id="❗️-기존css-방식과의-차이점">❗️ 기존(css) 방식과의 차이점</h4>
<blockquote>
<pre><code class="language-js">// CSS
display: flex;
justify-content: space-around;
font-weight: bold;
font-size: 12px;
flex: 1 1 auto;
</code></pre>
</blockquote>
<p>// ReactNative
display: &#39;flex&#39;,
justifyContent: &#39;space-between&#39;,
fontWeight: &#39;bold&#39;,
font-size: 12,
flexGrow: 1,
flexShrink: 1,
flexBasis: &#39;auto&#39;,</p>
<pre><code>

- 속성명을 작성할때, 단어구분을 카멜케이스로 구분한다.

- 속성값의 경우에는 문자열 형식으로 작성

- 스타일 속성 구분을 `,` 로 구분한다.

- px과 같은 단위 생략, 적용되는 단위는 대상 OS마다 다르다.
(ios는 논리픽셀, android는 DP)

- 축약형 사용이 불가능하다.

- 스타일 적용 우선순위가 적용방식에 따르지않고, 가장 나중에 전달되는 스타일이 우선순위가 높다.

- `display` 속성 값이 `flex` 와 `none` 두개뿐이다.

- `flexDirection` 의 기본값이 `column` 이다.



### 🕹 tag

html의 태그들처럼 기본적으로 제공하는 컴포넌트들이 있다.


**View** 

`div` 와 유사하다, 중첩이 가능하다.
하지만, `margin`/`padding`/`border` 박스모델 속성적용이 불가하다.

----

**SafeAreaView**

기기의 안전한 영역 경계 내, 콘텐츠를 렌더링, 자동으로 padding을 적용
(기기의 코너부분, 베터리표시 등의 도구모음과 영역이 겹치지 않게)
페이지의 최상위 Wrapper 컴포넌트로 많이 사용

---
**ScrollView**

내부 컨텐츠에 따라 자동적으로 스크롤 생성이 되지 않는 ReactNative에서
스크롤이 필요할때 사용,
`position: fixed` 가 불가능하지만 ScrollView를 사용해야만 스크롤이 생성되기에 고정된 UI 구현이 가능하다.

----
**KeyboardAvodingView**

키보드가 올라올 경우, 컨텐츠가 가려지는 문제를 해결하는 컴포넌트
behavior props로 회피 방법 설정 가능
input 사용 컴포넌트에서 필수적

---
**FlatList**

목록이 길어지면 자동적으로 내부에 ScrollView적용, 
아래로 당겼을시 refresh 기능을 props로 설정 가능


----
**Text** 

텍스트를 표현하기 위한 컴포넌트, 중첩이 가능하다.
&gt;
```js
&lt;View&gt;
    &lt;Text style={{fontWeight:&#39;bold&#39;}}&gt;
        입력된
        &lt;Text&gt;텍스트&lt;/Text&gt;
    &lt;/Text&gt;
&lt;/View&gt;</code></pre><hr>
<p><strong>TextInput</strong> </p>
<p>텍스트 입력을 위한 컴포넌트</p>
<hr>
<p><strong>Touchable</strong></p>
<p>다양한 Touchable 컴포넌트가 있지만, 앱 내 터치요소 통일성을 해칠 가능성이 있기에, 
적절한 하나의 Touchable 컴포넌트를 기본으로 사용하는걸 추천.</p>
<ul>
<li><p>button 
기본적 버튼 컴포넌트이지만 스타일링이 불가능해 활용도가 떨어짐</p>
</li>
<li><p>TouchableHighlight
터치 시 하이라이트 발생, 내부에 하나의 자식컴포넌트가 필수/둘 이상의 자식요소라면 그룹화(&lt;&gt;&lt;/&gt;) 필요</p>
</li>
<li><p>TouchableOpacity
터치 시 투명도 값이 적용, 내부에 여러 자식컴포넌트 가능</p>
</li>
</ul>
<hr>
<p><strong>Image</strong></p>
<p>이미지 표현에 사용되는 컴포넌트, source props에 경로 전달 필요</p>
<pre><code class="language-js">&lt;View&gt;
  &lt;Image 
   source={{url:&#39;이미지주소&#39;}}
  /&gt;
&lt;/View&gt;</code></pre>
<p>❗️ 앱 내부 이미지파일 불러올땐 <code>require</code> ,  네트워크 이미지/데이터 불러올땐 이미지의 사이즈영역 확보 필요</p>
<hr>
<p><strong>ImageBackground</strong></p>
<p>배경이미지를 넣을때 사용</p>
<pre><code class="language-js">&lt;View&gt;
  &lt;ImageBackground source={{uri: &#39;이미지주소&#39;}}&gt;
      &lt;Text&gt; 안녕하세요 &lt;/Text&gt;
  &lt;/ImageBackground&gt;
&lt;/View&gt;</code></pre>
<hr>
<p><strong>Modal</strong></p>
<p>기존 모달창과 같이 작동, 기존 레이아웃 위에 노출
항상 뷰포트 전체 크기값을 가짐, 설정 필요</p>
<hr>
<h3 id="🕹-props">🕹 props</h3>
<p>ReactNative 에는 style props 외에 UI렌더링에 영향을 주는 props들이 많다.</p>
<p><strong>numberOfLines,ellipsizeMode</strong></p>
<p>텍스트의 말줄임 처리를 <code>Text</code> 컴포넌트에 numberOfLines / ellipsizeMode 를 props로 주어 사용한다.</p>
<ul>
<li><p>numberOfLines 에 말줄임이 될 라인수를 전달</p>
</li>
<li><p>ellipsizeMode 에 &#39;head&#39;,&#39;middle&#39;,&#39;tail&#39;,&#39;clip&#39; 값을 주어 말줄임 방식을 조정
head 는 글의 첫 부분, middle은 가운데, tail은 끝, clip은 &#39;...&#39; 같은 줄임표시 없이 텍스트 자르기</p>
</li>
</ul>
<p>보통 tail 형식이 보편적으로 사용되는것 같다. (기본값이 tail이다)</p>
<hr>
<p><strong>hitSlop</strong></p>
<p>터치영역을 눈에 보이는 영역보다 확장할 경우, padding을 정교하게 계산하여 사용하기 어렵기에
주변 요소의 렌더링에 영향을 주지않고 터치영역만 증가시킬수있다.</p>
<pre><code class="language-js">&lt;View&gt;
  &lt;TouchableHighlight hitSlop={{top:10,right:10,bottom:10,left:10}}&gt;
      &lt;Text&gt; 버튼 &lt;/Text&gt;
  &lt;/TouchableHighlight&gt;
&lt;/View&gt;</code></pre>
<hr>
<p><strong>contentContainerStyle</strong></p>
<p><code>ScrollView</code> 를 사용할 때, 컨텐츠 내용이 부족해도 <code>ScrollView</code> 만큼 영역을 확보해야하는경우, <code>flexGrow: 1</code> 을 사용해 확보가 가능하다.</p>
<pre><code class="language-js">&lt;ScrollView contentContainerStyle={{ flexGrow: 1 }}&gt;
    &lt;View&gt;
        &lt;Text&gt;확보 영역&lt;/Text&gt;
    &lt;/View&gt;
&lt;/ScrollView&gt;</code></pre>
<hr>
<h3 id="👍-참고">👍 참고</h3>
<ul>
<li><a href="https://wit.nts-corp.com/2020/03/23/6014">https://wit.nts-corp.com/2020/03/23/6014</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[ReactNative-FlexBox]]></title>
            <link>https://velog.io/@bu_du_dak/ReactNative-FlexBox</link>
            <guid>https://velog.io/@bu_du_dak/ReactNative-FlexBox</guid>
            <pubDate>Thu, 02 Sep 2021 06:53:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/bu_du_dak/post/d99917f0-f4a3-4238-9c38-71da3e4082e7/reactNativeLogo.png" alt=""></p>
<h2 id="📌-reactnative에서-flex-는">📌 ReactNative에서 flex 는</h2>
<p><code>ReactNative</code> 를 사용하여 화면을 구성할 때, web 과는 조금 다른 부분이 있다.</p>
<p><code>flex</code> 를 사용하여 모바일 화면 안에서 얼마만큼을 사용 할지 비율로써 조정이 가능하다는 것이다.</p>
<p>예를 들어, <code>App</code> 화면을 정확히 반반 나누고 싶다는 가정을 해보면,</p>
<pre><code class="language-js">const App = () =&gt; {
    return(
        &lt;View style={styles.Wrapper}&gt;
              &lt;View style={styles.Container01}&gt;&lt;/View&gt;
              &lt;View style={styles.Container02}&gt;&lt;/View&gt;
          &lt;/View&gt;
    )
      const styles = styleSheet.create({
        Wrapper: {
            flex: 1
        },
        Container01: {
          flex: 1
        },
          Container02: {
          flex: 1,
          backgroundColor: &#39;red&#39;
        },
    })
}</code></pre>
<p>위의 결과물에 대한 화면은 아래와 같다.
<img src="https://images.velog.io/images/bu_du_dak/post/6b573b48-23b6-479d-a1f5-0ff4d457ea57/%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-09-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.37.05.png" alt=""></p>
<blockquote>
<p>❗️ 전체를 감싸는 <code>Wrapper</code> 라는 녀석은 화면전체(flex:1) 를 사용하고 있고,
자식요소로 들어간 <code>Container01</code> 와 <code>Container02</code> 는 부모요소를 1 : 1 비율로 차지하게 되는것이다.</p>
</blockquote>
<p>이를 활용하면, 이렇게도 만들 수 있다</p>
<pre><code class="language-js">const App = () =&gt; {
  return (
    &lt;&gt;
    &lt;View style={styles.Container}&gt; 
    &lt;/View&gt;

    &lt;View style={styles.container2}&gt;
      &lt;View style={styles.button01}&gt;
        &lt;Text style={styles.menuFont}&gt;Menu01&lt;/Text&gt;
      &lt;/View&gt;
      &lt;View style={styles.button01}&gt;&lt;Text&gt;Menu02&lt;/Text&gt;&lt;/View&gt;
      &lt;View style={styles.button01}&gt;&lt;Text&gt;Menu03&lt;/Text&gt;&lt;/View&gt;
      &lt;View style={styles.button01}&gt;&lt;Text&gt;Menu04&lt;/Text&gt;&lt;/View&gt;
    &lt;/View&gt;
    &lt;/&gt;
  )
}
const styles = StyleSheet.create({
  Container: {
    flex: 1,
    alignItems: &#39;center&#39;,
    justifyContent:&#39;center&#39;,
  },
  container2: {
    flex: 0.1,
    flexDirection: &#39;row&#39;,
    backgroundColor: &#39;red&#39;,
    alignItems: &#39;center&#39;,
    justifyContent:&#39;space-around&#39;,
  },
  button01: {
    width: &#39;25%&#39;,
    display: &#39;flex&#39;,
    height: &#39;100%&#39;,
    textAlign: &#39;center&#39;,
    alignItems: &#39;center&#39;,
    justifyContent: &#39;center&#39;,
  },
  menuFont:{
    fontSize: 12,
  }
})
export default App;
</code></pre>
<p><img src="https://images.velog.io/images/bu_du_dak/post/64400013-87dc-4484-9b5e-25533307b102/%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-09-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.49.57.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React-Native 시작하기]]></title>
            <link>https://velog.io/@bu_du_dak/React-Native-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@bu_du_dak/React-Native-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 02 Sep 2021 04:09:38 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/bu_du_dak/post/9f120848-3702-4d14-898e-0b2e03b8dca4/reactNativeLogo.png" alt=""></p>
<blockquote>
<p>시작에 앞서, 설치자의 환경에 따라 설치방법이 달라지는데 아래 내용은 Mac 기준 / android 앱 구축 설정이다.</p>
</blockquote>
<p>OS별 / 개발대상 OS 별 설치는 
<a href="https://reactnative.dev/docs/troubleshooting#content">https://reactnative.dev/docs/troubleshooting#content</a> &lt;-공식 문서를 참고</p>
<p><code>React-Native</code> 를 통한 android App 개발을 위해서는 <code>Node</code> <code>Watchman</code> <code>JDK</code> <code>AndroidStudio</code> 가 필요하다.</p>
<h3 id="📍-homebrew">📍 Homebrew</h3>
<p><code>Node</code> 와 <code>Watchman</code> 을 설치하기 위해서는 <code>Homebrew</code> 를 이용하여 설치한다.</p>
<p><code>Homebrew</code> 는 Mac에서 필요한 패키지를 설치하는 관리자 역할을 한다.</p>
<blockquote>
<ul>
<li>Homebrew 설치 : <a href="https://brew.sh/">https://brew.sh/</a> </li>
</ul>
<p>설치가 완료되면 <code>brew --version</code> 로 버전 확인이 가능하다.</p>
</blockquote>
<p>이후, <code>Homebrew</code> 를 사용해 <code>Node</code> / <code>Watchman</code> 을 설치한다.</p>
<h3 id="📍-node">📍 Node</h3>
<blockquote>
<ul>
<li>Node 설치 : <code>brew install node</code> </li>
</ul>
</blockquote>
<ul>
<li>Node 버전 확인 : <code>node --version</code><blockquote>
</blockquote>
❗️ Node가 설치되면 기본 패키지 매니저인 npm 또한 설치되는것을 확인해준다.</li>
<li>npm 버전 확인 : <code>npm --version</code></li>
</ul>
<h3 id="📍-watchman">📍 Watchman</h3>
<p>❕ Watchman은 특정 폴더/파일에 변화가 생기면 특정 동작이 실행되도록 설정해주는 역할을 한다.</p>
<blockquote>
<ul>
<li>Watchman 설치 : <code>brew install watchman</code></li>
</ul>
</blockquote>
<ul>
<li>Watchman 버전 확인 : <code>watchman --version</code> </li>
</ul>
<h3 id="📍-jdk">📍 JDK</h3>
<p> ❕ JDK는 자바 개발 키트의 약자로, Java로 소프트웨어를 개발할 수 있도록 여러 기능을 제공하는 패키지다.</p>
<blockquote>
<ul>
<li>JDK 설치 : <code>brew install -- cask adoptopenjdk/openjdk/adoptopenjdk8</code></li>
</ul>
<p>❗️ 설치된 JDK는 JDK 8 이상이여야 한다.</p>
</blockquote>
<h3 id="📍-android-studio">📍 Android Studio</h3>
<p> 안드로이드 스튜디오 설치에는 사용자마다 고려사항이 많기에 [React-Native 공식문서] (<a href="https://reactnative.dev/docs/troubleshooting#content">https://reactnative.dev/docs/troubleshooting#content</a>) 의 Android Studio 설치 부분을 읽으며 따라가는것이 좋다.</p>
<h2 id="🕹-애플리케이션-만들기">🕹 애플리케이션 만들기</h2>
<p> 위 과정을 모두 완료하였다면, 이제 codeEditor 에서 새 프로젝트를 생성한다.</p>
<blockquote>
<ul>
<li><code>npx react-native init 프로젝트명</code></li>
</ul>
<ul>
<li>만약 개발을 위해 특정 버전을 지정하여 설치를 해한다면,
<code>npx react-native init 프로젝트명 --version X.XX.X</code></li>
</ul>
<ul>
<li>사용자 지정 <code>React-Native</code> 템플릿으로 개발을 시작할경우(ex. <code>Typescript</code>),
<code>npx react-native init 프로젝트명 --template react-native-template-typescript</code></li>
</ul>
</blockquote>
<h2 id="🕹-애플리케이션-시작">🕹 애플리케이션 시작</h2>
<p>  <code>React-Native</code> 시작을 위해서는 <code>React-Native</code> 와 함께 제공되는 <code>Metro</code> 를 먼저 실행시켜야 한다.</p>
<p>  프로젝트 위치에서 <code>npx react-native start</code> 를 통해 <code>Metro</code> 를 실행시킨후, </p>
<p>  새로운 터미널을 열어, <code>npx react-native run-android</code> 를 실행시켜 Android 에뮬레이터를 구동합니다.</p>
<p>  <img src="https://images.velog.io/images/bu_du_dak/post/7460f1ca-1f47-4b56-8c48-7c038151e236/%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-09-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.07.42.png" alt=""></p>
<p>  위와 같은 화면이 나오면 성공이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React-Hook-Form]]></title>
            <link>https://velog.io/@bu_du_dak/React-Hook-Form</link>
            <guid>https://velog.io/@bu_du_dak/React-Hook-Form</guid>
            <pubDate>Thu, 05 Aug 2021 08:45:07 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-react-hook-form-이란">📌 React-Hook-Form 이란</h2>
<p>리액트를 사용하는 프로젝트에서 많은 폼 양식을 사용하게 되는데 이를 더욱 쉽게 관리할 수 있게 도와주는 라이브러리가 <code>React-Hook-Form</code> 이다.</p>
<p>🕹 설치 -  <code>yarn add react-hook-form</code> </p>
<p>기존 사용 코드 예시를 보면,</p>
<pre><code class="language-js">export default function Page(){
      const [title,setTitle] = useState(&#39;&#39;)
       const [contents,setContents] = useState(&#39;&#39;)
    return(
        &lt;&gt;
              제목 : &lt;input type=&quot;text&quot; onChange={onChangeTitle} /&gt;
            내용 : &lt;input type=&quot;text&quot; onChange={onChangeContents} /&gt;
                  &lt;button onClick={onClickButton}&gt;등록&lt;/button&gt;
          &lt;/&gt;
    )
}</code></pre>
<p>위와 같이 <code>state</code> 를 사용하여 <code>input</code> 의 값을 전달하고 관리하였다</p>
<p>이를 <code>react-hook-form</code> 을 사용하면,</p>
<pre><code class="language-js">import {useForm} from &#39;react-hook-form&#39;
export default function Page(){
  const {register,handleSubmit} = useForm({
      mode:&#39;onChange&#39;
  })
    return(
        &lt;&gt;
          &lt;form onSubmit={handleSubmit(onClickButton)}&gt;
              제목 : &lt;input type=&quot;text&quot; register={...register(&#39;title&#39;)}/&gt;
            내용 : &lt;input type=&quot;text&quot; register={...register(&#39;content&#39;)}/&gt;
                  &lt;button type=&#39;submit&#39;&gt;등록&lt;/button&gt;
    &lt;/form&gt;
          &lt;/&gt;
    )
}</code></pre>
<p>로 따로 state 를 사용하지 않고 등록이 가능하다
쉽게 생각해서 <code>register</code> 는 입력값을 담는 통, <code>handleSubmit</code>은 () 내를 실행시키는 기능 이라고 생각하면 이해가 조금 낫다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[context]]></title>
            <link>https://velog.io/@bu_du_dak/context</link>
            <guid>https://velog.io/@bu_du_dak/context</guid>
            <pubDate>Mon, 02 Aug 2021 10:30:52 GMT</pubDate>
            <description><![CDATA[<p>지금까지 <strong>부모 컴포넌트</strong>에서 <strong>자식 컴포넌트</strong>에게 데이터를 전달 할 때, <code>props</code> 를 사용해왔다.</p>
<p>프로젝트의 규모가 커지면 커질 수록 여러 컴포넌트들에게 전해줘야하는 <code>props</code>는 과정이 상당히 번거로울 수 있다.</p>
<p>이를 <code>context</code> 를 사용하면 쉽게 값을 공유할 수 있다.</p>
<hr>
<h3 id="📌-context-">📌 context ?</h3>
<p><code>context</code> 는 컴포넌트 안에서 전역적(global) 데이터를 공유할 수 있도록 고안된 방안이다.</p>
<p>예를 들어 <code>props</code> 를 사용하여 값을 전달해 줄때는 index -&gt; container -&gt; presenter  와 같은 과정을 거쳐 단계별로 값을 전달해 주었지만 context는 중간 단계를 건너 뛰고 바로 값을 전달해 줄 수 있다.</p>
<hr>
<h3 id="📌-사용법">📌 사용법</h3>
<p>어떤 Presenter 에  <code>isEdit</code> 이라는 값을 넘겨주고 싶다하면,</p>
<p>최상위 요소에서  <code>context</code>를 만들어주고 <code>context</code>의 값을 넘겨줄 컴포넌트들을 감싸주어야 한다</p>
<pre><code class="language-js">import {createContext} from &#39;react&#39;
export const Context createContext({}) // react의 createContext를 선언
const ContextValue = {
    isEdit : true
}
export default function Page(){
  return (
      &lt;Context.Provider value={ContextValue}&gt;
            &lt;Container/&gt;    // presenter 를 return 해주고있다
          &lt;/Context.Provider&gt;
  )
}</code></pre>
<p>이렇게 보내진 isEdit은 <code>props</code> 로 전달받지 않고 사용이 가능하다</p>
<pre><code class="language-js">import {useContext} from &#39;react&#39;    // 받은 값을 사용하는 쪽에서 선언
import {Context} from &#39;../../Page&#39;
export default function presenter(){
    const {isEdit} = useContext(Context)
    return(
        &lt;div&gt;{isEdit ? &#39;수정&#39; : &#39;등록&#39;}&lt;/div&gt;
    )
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[map() - 화면출력]]></title>
            <link>https://velog.io/@bu_du_dak/map-%ED%99%94%EB%A9%B4%EC%B6%9C%EB%A0%A5</link>
            <guid>https://velog.io/@bu_du_dak/map-%ED%99%94%EB%A9%B4%EC%B6%9C%EB%A0%A5</guid>
            <pubDate>Thu, 29 Jul 2021 08:24:39 GMT</pubDate>
            <description><![CDATA[<p>화면에 반복적인 출력을 처리하기 위해 <code>map</code> 을 사용할 수 있다.</p>
<blockquote>
</blockquote>
<p>예시)</p>
<blockquote>
</blockquote>
<p>숫자가 담겨있는 <code>arr</code> 의 요소들을 <code>div</code> 안에 담아 배열의 숫자만큼 반복하여 출력하고 싶다면,</p>
<blockquote>
</blockquote>
<pre><code class="language-js">const arr [&#39;이런&#39;,&#39;배열&#39;,&#39;1&#39;,3]
const manyDiv = arr.map(data =&gt; (&lt;div&gt;{data}&lt;/div&gt;))
return (
        {manyDiv}
        )
// --화면출력--
// 이런
// 배열
// 1
// 3</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[useRef()]]></title>
            <link>https://velog.io/@bu_du_dak/useRef</link>
            <guid>https://velog.io/@bu_du_dak/useRef</guid>
            <pubDate>Mon, 26 Jul 2021 08:44:43 GMT</pubDate>
            <description><![CDATA[<h2 id="❓-useref-">❓ useRef() ?</h2>
<p>특정 <strong>DOM</strong>을 가리킬 때 사용하는 함수</p>
<p><code>getElementById</code> 와 같이, 함수형 컴포넌트의 어떤 부분을 선택 할 수 있게 해주는 방법</p>
<blockquote>
<p>❗️여기서 <code>DOM</code> 이란 <code>Document Object Model</code> 의 약자</p>
</blockquote>
<p>문서 객체 모델 이라는 것인데 <code>html</code> 문서의 태그들을 <code>javaScript</code>가 이용 할 수 있는 객체로 만든것이 문서 객체</p>
<pre><code class="language-js">import { useEffect, useRef } from &#39;react&#39;
export default function Page(){
    const inputRef = useRef()
    useEffect(()=&gt;{
        inputRef.current?.focus()
    },[])
  return (
      &lt;input type=&quot;text&quot; ref={inputRef}/&gt;
  )
}</code></pre>
<p>위와 같은 방식으로 <code>useEffect</code>와 혼용하여 렌더링 후 <code>input</code> 에 자동적으로 커서가 이동되어 있게 설정이 가능하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[useEffect()]]></title>
            <link>https://velog.io/@bu_du_dak/useEffect</link>
            <guid>https://velog.io/@bu_du_dak/useEffect</guid>
            <pubDate>Mon, 26 Jul 2021 08:05:52 GMT</pubDate>
            <description><![CDATA[<h2 id="❓-useeffect-">❓ useEffect() ?</h2>
<p><code>useEffect</code> 함수는 <strong>컴포넌트가 렌더링 될 때마다 특정 작업을 실행</strong>할 수 있도록 하는 기능</p>
<h3 id="📌-기본형태">📌 기본형태</h3>
<blockquote>
</blockquote>
<pre><code class="language-js">useEffect(function,[])
// function 자리에 수행하고자 하는 작업, [] 에 검사하고자 하는 특정 값이 들어간다</code></pre>
<p>예시)</p>
<pre><code class="language-js">useEffect(()=&gt;{
    console.log(&#39;마운트 !&#39;)
},[])</code></pre>
<hr>
<p><code>useEffect</code> 를 사용하면 컴포넌트가 <strong>마운트</strong> 됐을 때(처음 나타났을 때), <strong>언마운트</strong> 됐을 때(사라졌을 때), <strong>업데이트</strong> 될 때(특정 props가 바뀔때) 특정 작업 처리가 가능하다.</p>
<h3 id="❗️-마운트-처음-렌더링">❗️ 마운트 (처음 렌더링)</h3>
<pre><code class="language-js">useEffect(()=&gt;{
    console.log(&#39;마운트 될 떄만 실행&#39;)
},[])</code></pre>
<p>컴포넌트가 화면에 처음 렌더링 될 때 한번만 실행되는 경우, 빈 배열을 넣는다.</p>
<hr>
<h3 id="❗️-언마운트-렌더링이-사라질-때">❗️ 언마운트 (렌더링이 사라질 때)</h3>
<pre><code class="language-js">useEffect(()=&gt;{
    console.log(&#39;나타납니다&#39;)
      return () =&gt; {
        console.log(&#39;사라집니다&#39;)
    }
},[])</code></pre>
<p><code>useEffect</code> 에서 함수를 반환할 수 있는데, 이를 <code>cleanup</code> 함수라 부른다.
[] 란이 비어있는 경우 컴포넌트가 사라질때 호출된다.</p>
<p>만약 특정값이 업데이트 되기 직전, <code>cleanup</code> 함수를 실행하고 싶다면 [] 란에 검사하고 싶은 값을 넣어주면 된다.</p>
<hr>
<h3 id="❗️-업데이트-특정-값이-변경될-때">❗️ 업데이트 (특정 값이 변경될 때)</h3>
<pre><code class="language-js">useEffect(()=&gt;{
    console.log(age)
      console.log(&#39;age&#39;가 업데이트 된다)
},[age])</code></pre>
<p>특정값이 업데이트 될 때 실행하고 싶다면 [] 안에 검사하고 싶은 값을 넣어준다</p>
<p>이때, 업데이트 시에만 실행되는것이 아니라 마운트 시에도 실행된다.
업데이트 시에만 특정 함수 실행을 원한다면 조건을 붙여 사용하는것 또한 가능하다.</p>
<pre><code class="language-js">useEffect(()=&gt;{
    if(isChange === true){
              alert(&#39;바뀌었습니다&#39;)
        }
},[isChange])</code></pre>
<hr>
<h3 id="❗️-특정값이-들어간-경우">❗️ 특정값이 들어간 경우</h3>
<p>[]에 특정 값을 넣게 되면 컴포넌트가 처음 마운트 될 때, 지정값이 변경될 때, 언마운트 될 때, 값이 바뀌기 직전에 모두 호출 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[interface]]></title>
            <link>https://velog.io/@bu_du_dak/interface</link>
            <guid>https://velog.io/@bu_du_dak/interface</guid>
            <pubDate>Wed, 21 Jul 2021 07:24:24 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-interface">📌 interface</h2>
<ul>
<li><p>타입 확인을 위해 사용</p>
</li>
<li><p>변수, 함수, 클래스에 사용</p>
</li>
<li><p>여러타입을 갖고 있는 요소로 이루어진 새로운 타입을 정의</p>
</li>
</ul>
<hr>
<pre><code class="language-js">interface Student ={
    name: String,
      age: number
}</code></pre>
<p>위의 예제에서 <code>Student</code> 는 <code>name</code> 과 <code>age</code> 의 속성을 가지고 있는 <code>interface</code>
즉, 하나의 타입을 만들어 사용한다고 선언하는 것과 같다.</p>
<pre><code class="language-js">let Bob: Student = {
    name: &#39;Bob&#39;,
      age: 10
}</code></pre>
<p><code>Bob</code> 이라는 변수를 만드는데 이 변수의 타입은 위의 <code>Student</code> 인 것</p>
<hr>
<h3 id="📌-선택적-속성">📌 선택적 속성</h3>
<p><code>interface</code> 사용 시, 속성은 반드시 구현되어야 한다. 
그러나, <strong>속성 끝에 ?</strong> 를 붙여 주면 정의한 모든 속성을 전부 사용하지 않아도 된다.</p>
<pre><code class="language-js">interface Student ={
    name?: String,
      age: number
}

let Bob: Student = {
      age: 10
}</code></pre>
<hr>
<h3 id="📌-함수-interface">📌 함수 interface</h3>
<p>함수의 타입 정의에도 사용이 가능하다</p>
<pre><code class="language-js">interface Sum{
    (a: number, b: number) : number
}

let sum: Sum

sum = function(a,b){
  return a+b
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[레이아웃]]></title>
            <link>https://velog.io/@bu_du_dak/21.07.21</link>
            <guid>https://velog.io/@bu_du_dak/21.07.21</guid>
            <pubDate>Wed, 21 Jul 2021 06:36:35 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-레이아웃">📌 레이아웃</h2>
<p>레이아웃은 프로젝트 전체의 UI 구조를 의미</p>
<p><code>Header</code>, <code>Navigation</code>, <code>Menu</code>, <code>Footer</code>, <code>Main</code> 등으로 화면을 쪼개 하나의 컴포넌트에 조립시켜 보여주는 것
<img src="https://images.velog.io/images/bu_du_dak/post/0ac8f1eb-3dda-44ff-b1a1-21e83b734e85/%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-07-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.35.12.png" alt=""></p>
<h3 id="📌-구성">📌 구성</h3>
<p><img src="https://images.velog.io/images/bu_du_dak/post/882f7eb9-5fd5-44f1-b74d-904d3134549b/%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-07-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.08.38.png" alt=""></p>
<p>화면 구성을 위해 <code>Header</code>, <code>Navigation</code>, <code>Banner</code>, <code>Body</code>, <code>Footer</code> 로 나누어놓은 컴포넌트와</p>
<p>쪼개 놓은 컴포넌트를 하나로 조립하는 <code>index</code> 파일로 나누어져 있다.</p>
<p><img src="https://images.velog.io/images/bu_du_dak/post/e0bb6052-b994-481d-8070-ee6680282af9/%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-07-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.09.22.png" alt=""></p>
<p>쪼개놓은 컴포넌트를 <code>import</code> 시켜 사용하며, 기존과 동일하게 사용되는걸 확인할 수 있다.</p>
<p>❗️ <code>index</code> 파일 내부를 보면 <code>props.children</code> 이 있는데, 이 부분이 주소에 따라 다르게 들어가는 내부 내용이다. </p>
<p>만약 <code>http://localhost:3000/boardDetail</code> 로 접속을 한다면, <code>{props.children}</code> 자리에 <code>boardDetail</code>의 <code>container</code> 가 들어가는 것이다.</p>
<p>이 개념에 대해서 조금 더 이해하기 위해서는 작동 방식을 알아야 하는데, 어느 주소로 접속을 하던 가장 먼저 실행되는 파일이 <code>_app.tsx</code> 다</p>
<p><img src="https://images.velog.io/images/bu_du_dak/post/42cab3e1-5e2c-493f-92ff-43bb904a7ab1/%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-07-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.08.52.png" alt=""></p>
<p><code>_app.tsx</code> 의 구조를 보면, 위에서 만든 <code>Layout</code> 또한 <code>import</code> 되어 해당 프로젝트의 어느 주소를 실행 시키든 <code>Layout</code> 의 컴포넌트들이 모든 페이지에서 붙어 나오게 되는것이다.</p>
<p><code>Layout</code> 내부에 <code>Component</code>, <code>{...pageProps}</code> 가 있는데 태그 내부의 자식들은  따로 명시하지 않아도 자동으로 <code>children</code> 이란 이름으로 <code>props</code>로 넘어간다.</p>
<p><code>_app.tsx</code> 에서 <code>Layout</code> 으로 <code>props</code> 를 전달해주면, 최종적으로 바디영역 전체 <code>Layout</code> 이 <code>children</code> 이 되며 각각의 모든 페이지는 바디영역에 보여지게 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[filter(), map() / spread]]></title>
            <link>https://velog.io/@bu_du_dak/filter-map-spread</link>
            <guid>https://velog.io/@bu_du_dak/filter-map-spread</guid>
            <pubDate>Tue, 20 Jul 2021 07:30:42 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-filter">📌 filter()</h2>
<blockquote>
<p><code>filter</code>는 배열에서 조건을 주고, <strong>조건이 참인 요소들</strong>을 모아 <strong>새로운 배열로 반환</strong></p>
</blockquote>
<p><em>❗️ 하지만 중복값을 제거해주지는 않는다</em></p>
<pre><code class="language-js">const student = [
  {name: &quot;뚱이&quot;, age: 5},
  {name: &quot;스폰지밥&quot;,age: 4},
  {name: &quot;다람이&quot;,age: 6},
  {name: &quot;집게사장&quot;,age: 10}
]
const result = student.filter((con,idx,arr) =&gt; con.age&gt;4 &amp;&amp; idx&gt;1)    
// 다람이, 집게사장</code></pre>
<p><code>filter()</code> ()안에는 순서대로 (요소, 인덱스, 배열) =&gt; (필터조건) 이 들어간다.</p>
<p>❗️()안 (요소, 인덱스, 배열)의 모든 요소는 필수가 아니고 찾으려는 조건에 따라 다르다.</p>
<p>위의 예시는 <code>result</code>에 <code>age</code>가 4보다 높고 <code>indexNumber</code>가 1보다 큰 배열의 값만 추출하여 넣어 준것.</p>
<hr>
<h2 id="📌-map">📌 map()</h2>
<blockquote>
<p><code>map</code> 은 함수를 사용해 배열내의 각각의 요소에 대해 한번씩 순서대로 호출해 그 함수의 <strong>반환값으로 새로운 배열로 반환</strong></p>
</blockquote>
<pre><code class="language-js">const student = [
  {name: &quot;뚱이&quot;, age: 5},
  {name: &quot;스폰지밥&quot;,age: 4},
  {name: &quot;다람이&quot;,age: 6},
  {name: &quot;집게사장&quot;,age: 10}
]
const resultName = student.map((con,idx,arr)=&gt;`${con.name} 씨`)
// [&quot;뚱이 씨&quot;, &quot;스폰지밥 씨&quot;, &quot;다람이 씨&quot;, &quot;집게사장 씨&quot;]
const resultAge = student.map((con,idx,arr)=&gt;`${con.age}세`)
// [&quot;5세&quot;, &quot;4세&quot;, &quot;6세&quot;, &quot;10세&quot;]</code></pre>
<p>위의 예시에서는 이름 뒤에 &quot;<del>씨&quot;를 붙여 이름만들 뽑아 <code>resultName</code> 에 넣어주었고
나이만 뽑아서 나이 뒤에 &quot;</del>세&quot;를 붙여 <code>resultAge</code> 에 넣어주었다</p>
<h3 id="📌-filtermap-혼용">📌 filter,map 혼용</h3>
<p><code>filter</code> 와 <code>map</code> 을 같이 쓰면 위의 예시에서 _다람이_와 _집게사장_에게만 &quot;<del>씨&quot;, &quot;</del>세&quot;를 붙여주는것이 가능하다.</p>
<pre><code class="language-js">const student = [
  {name: &quot;뚱이&quot;, age: 5},
  {name: &quot;스폰지밥&quot;,age: 4},
  {name: &quot;다람이&quot;,age: 6},
  {name: &quot;집게사장&quot;,age: 10}
]
student.filter((con,idx,arr) =&gt; con.age&gt;4 &amp;&amp; idx&gt;1).map((con,idx,arr)=&gt;`${con.name} 씨`)
// [&quot;다람이 씨&quot;, &quot;집게사장 씨&quot;]
student.filter((con,idx,arr) =&gt; con.age&gt;4 &amp;&amp; idx&gt;1).map((con,idx,arr)=&gt;`${con.age}세`)
// [&quot;6세&quot;,&quot;10세&quot;]</code></pre>
<hr>
<h2 id="📌-spread">📌 spread</h2>
<p>위에서 사용한 예제들은 특정 값만을 뽑아 새로운 배열로 만들어 주는것이였는데, <code>spread</code>를 사용하면 기존 배열형태를 유지하며 뽑아낼 수 있다</p>
<pre><code class="language-js">student.filter((con,idx,arr) =&gt; con.age&gt;4 &amp;&amp; idx&gt;1).map(con =&gt; {
  return {
    ...con,
      name: con.name+&#39; 씨&#39;
    }
})

// [{name:&quot;다람이 씨&quot;, age:6 }, {name:&quot;집게사장 씨&quot;, age:10 }]</code></pre>
<h3 id="spread-란">spread 란</h3>
<blockquote>
<p><code>spread</code> 는 <code>배열</code>, <code>문자열</code>, <code>객체</code> 등 반복 가능한 객체를 <strong>개별 요소</strong>로 분리해준다</p>
</blockquote>
<p>따라서 연결이나 복사 등의 용도로 사용하기 좋다</p>
<p>예시를 들자면, </p>
<pre><code class="language-js">let arr = [1,2,3,4,5]
let arr2 = [...arr,6,7,8,9,10]
// arr2에는 [1,2,3,4,5,6,7,8,9,10] 이 담기게 된다.

let str = &quot;ABC D EFG&quot;
let str2 = [...str]
// str2에는 [&quot;A&quot;,&quot;B&quot;,&quot;C&quot;,&quot; &quot;,&quot;D&quot;,&quot; &quot;,&quot;E&quot;,&quot;F&quot;,&quot;G&quot;] 가 담긴다.</code></pre>
<p>아래 예시를 보면 <strong>배열병합</strong>이 더 편한것을 알 수 있다.</p>
<pre><code class="language-js">let arr = [1,2,3]
let arr2 = [4,5,6]
let arr3 = [...arr, ...arr2]
// [1,2,3,4,5,6]
let arr4 = [0,...arr,...arr2,7,8,9]
// [0,1,2,3,4,5,6,7,8,9]</code></pre>
<p>배열을 <strong>복사</strong> 할 때에도 기존배열은 건들지 않고 새로운 배열을 만들 수 있다.</p>
<pre><code class="language-js">let arr = [&quot;뚱이&quot;,&quot;징징이&quot;]
let arr2 = [...arr]
arr2.push(&quot;다람이&quot;)
// arr2 = [&quot;뚱이&quot;,&quot;징징이&quot;,&quot;다람이&quot;]
// arr = [&quot;뚱이&quot;,&quot;징징이&quot;]</code></pre>
<p>❗️ 하지만 <code>sprea</code>를 사용하여 배열을 복사 할 때 배열 내 객체를 복사하는것이 아니라 <strong>참조</strong>하는 것이기에(<strong>얕은 복사</strong>) 객체를 변경하는 경우 원본배열, 새로운배열 모두 값이 변하게 된다.</p>
<pre><code class="language-js">const arr = [{name:&quot;스폰지밥&quot;,age:4}]
const arr2 = [...arr]
arr2[0].name=&quot;물고기&quot;
console.log(arr)
//[{name:&quot;물고기&quot;,age:4}]
console.log(arr2)
//[{name:&quot;물고기&quot;,age:4}]</code></pre>
<h4 id="📌-객체의-경우">📌 객체의 경우</h4>
<p>객체를 복사하거나 업데이트를 할 때도 요긴하다.</p>
<pre><code class="language-js">let a = {name:&quot;퐁퐁&quot;,age:5}
a = {...a, school:&quot;바다초&quot;}
console.log(a)
// {name:&quot;퐁퐁&quot;, age:5, school:&quot;바다초&quot;}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[프레임워크와 라이브러리]]></title>
            <link>https://velog.io/@bu_du_dak/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%EC%99%80-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC</link>
            <guid>https://velog.io/@bu_du_dak/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%EC%99%80-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC</guid>
            <pubDate>Mon, 19 Jul 2021 07:57:21 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-프레임워크란">📌 프레임워크란?</h2>
<p><del>프레임워크는 소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것</del></p>
<p>이해하기 너무 어려운 말이고 쉽게 생각해서,</p>
<blockquote>
<ul>
<li><strong>어떤 프로그램을 만들기 위한 기본 틀 / 뼈대</strong></li>
</ul>
</blockquote>
<ul>
<li><strong>제공받는 일정한 요소, 틀, 규칙을 가지고 무언가를 만드는 것</strong></li>
</ul>
<h3 id="❓장점">❓장점</h3>
<blockquote>
<ul>
<li>프레임워크 사용으로 프로그램을 편리하고 빠르게 만들 수 있음</li>
</ul>
<ul>
<li>체계적 제작으로 유지보수에 용이</li>
</ul>
</blockquote>
<h3 id="❓단점">❓단점</h3>
<blockquote>
<ul>
<li>자유로운 개발에 한계가 있음</li>
</ul>
</blockquote>
<h4 id="🐒-한줄요약">🐒 한줄요약</h4>
<p><strong>프레임워크</strong> = 눈사람 모양과자 굽는데 쓰이는 <strong>눈사람모양 쿠키 틀</strong></p>
<hr>
<h2 id="📌-라이브러리란">📌 라이브러리란?</h2>
<p><del>라이브러리는 소프트웨어 개발 시 사용되는 프로그램의 구성요소로, 공통으로 사용될 수 있는 특정한 기능들을 모듈화한 것</del></p>
<p>역시나 무슨말인지 모르겠고, 프레임워크의 비유에 더해보면</p>
<p>❗️프레임워크는 무언가를 만들때 꼭 사용해야하는 요소, 지켜야하는 메뉴얼이라면</p>
<blockquote>
<p>라이브러리는</p>
<ul>
<li><strong>프로그램을 개발하기 위해 쓰는 공구와 도구들</strong></li>
</ul>
<ul>
<li><strong>내가 편한대로 쓰는 알맞은 도구의 모음</strong></li>
</ul>
<p>(언제든 필요한 곳에서 호출하여 사용할 수 있도록 <code>class</code> / <code>function</code>으로 만들어져있음)</p>
<ul>
<li>프레임워크에서 제공되는 요소와 규칙만들 지키면 그밖에 나머지는 어떤 라이브러리를 사용하여도 무관</li>
</ul>
</blockquote>
<h3 id="❓장점-1">❓장점</h3>
<blockquote>
<ul>
<li>재사용 가능한 코드로 가독성과 유지보수 향상</li>
</ul>
<ul>
<li>프로그래밍 시간이 줄어들어 생산성 향상</li>
</ul>
</blockquote>
<h4 id="🐒-한줄요약-1">🐒 한줄요약</h4>
<p><strong>라이브러리</strong> = 눈사람 모양과자 굽는데 쓰이는 <strong>반죽(누군가 만들어놓은), 마트에서 사온 건포도</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Props]]></title>
            <link>https://velog.io/@bu_du_dak/Props</link>
            <guid>https://velog.io/@bu_du_dak/Props</guid>
            <pubDate>Sun, 18 Jul 2021 15:50:46 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-props">📌 Props</h2>
<p><code>props</code> 는 <strong>부모컴포넌트</strong>가 <strong>자식컴포넌트</strong>에게 넘겨준 <strong>데이터</strong>와 <strong>기능</strong> 등 을 의미</p>
<hr>
<p>❓ <code>react</code> 를 사용하며 폴더 구조를 나눈 이후를 생각하면</p>
<blockquote>
</blockquote>
<p><code>Container</code> (부모컴포넌트) 
<img src="https://images.velog.io/images/bu_du_dak/post/c7e599ea-22c1-4107-ad6a-ceb62e8cbc7d/%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-07-19%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.11.12.png" alt=""></p>
<blockquote>
<p><code>Presenter</code> (자식컴포넌트)
<img src="https://images.velog.io/images/bu_du_dak/post/65a29f46-97ac-45cb-a26d-1141a952feb8/%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-07-19%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.11.42.png" alt=""></p>
</blockquote>
<p>위와 같이 컴포넌트를 나누면서 데이터와 기능의 연결이 끊어졌다</p>
<p>이때, 부모컴포넌트의 <code>data = {data}</code>와 <code>onClickMoveToBoardDetail={onClickMoveToDetail}</code> 처럼 <code>props</code> 로 연결이 가능하다</p>
<hr>
<h4 id="📌-props의-구조분해할당">📌 props의 구조분해할당</h4>
<p><code>props</code> 를 받아오면 위의 <code>presenter</code> 에서 볼 수 있듯, </p>
<p><code>props.onClickMoveToDetail</code> / <code>props.deleteBoard</code> 처럼 앞에 계속 <code>props</code> 를 붙여야한다.
이를 구조분해할당을 통해 사용 할 수 있다.</p>
<blockquote>
<p>❗️ <code>props.deleteBoard</code> 를 예시로</p>
</blockquote>
<pre><code class="language-js">export default function BoardListUI(props){
    &lt;ColumnContentsDelete onClick={props.deleteBoard}&gt;삭제하기&lt;/ColumnContentsDelete&gt;
}</code></pre>
<p>위의 코드를</p>
<pre><code class="language-js">export default function BoardListUI({deleteBoard}){
    &lt;ColumnContentsDelete onClick={deleteBoard}&gt;삭제하기&lt;/ColumnContentsDelete&gt;
}</code></pre>
<p>처럼 {} 중괄호를 통해 구조분해 할당을 하여 <code>props</code> 없이 사용 할 수 있다.</p>
<hr>
<h4 id="📌-emotion에-props-전달">📌 emotion에 props 전달</h4>
<p><code>emotion</code> 태그에도 <code>props</code> 전달이 가능하다</p>
<blockquote>
<pre><code class="language-js">import { useState } from &#39;react&#39;;
import { Test } from &#39;../../src/test2&#39;;
export default function Test2() {
    const [isTrue, setIsTrue] = useState(false);
    const handleOnClick = () =&gt; {
        setIsTrue((prev) =&gt; !prev);    // useState로 설정된 기본값 false를 true로 바꿈
    };
    return (
        &lt;&gt;
            &lt;Test isTrue={isTrue} onClick={handleOnClick}&gt;색바꾸기&lt;/Test&gt;
        &lt;/&gt;
    );
}</code></pre>
</blockquote>
<pre><code>&gt;`isTrue` 의 값을 `emotion` 으로 넘겨준다 
&gt;```js
import styled from &#39;@emotion/styled&#39;;
export const Test = styled.div`
    color: ${(prev) =&gt; (props.isTrue ? &#39;red&#39; : &#39;blue&#39;)};
`;</code></pre><blockquote>
<p>삼항연산자를 사용하여 <code>isTrue</code> 값에 따라 색을 지정해준다</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[비구조화할당(구조분해할당)]]></title>
            <link>https://velog.io/@bu_du_dak/%EB%B9%84%EA%B5%AC%EC%A1%B0%ED%99%94%ED%95%A0%EB%8B%B9%EA%B5%AC%EC%A1%B0%EB%B6%84%ED%95%B4%ED%95%A0%EB%8B%B9</link>
            <guid>https://velog.io/@bu_du_dak/%EB%B9%84%EA%B5%AC%EC%A1%B0%ED%99%94%ED%95%A0%EB%8B%B9%EA%B5%AC%EC%A1%B0%EB%B6%84%ED%95%B4%ED%95%A0%EB%8B%B9</guid>
            <pubDate>Sun, 18 Jul 2021 14:33:11 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-구조-분해-할당-이란">📌 구조 분해 할당 이란?</h2>
<p><strong><em>구조 분해 할당</em></strong>은 쉽게 말해, <em><strong>배열과 객체를 해체하여 안의 값을 사용</strong></em> 하는 것</p>
<p>다시말해 <strong>배열이나 객체의 구조를 분해하고 할당</strong> 하는 것</p>
<h3 id="❓-배열-구조-분해">❓ 배열 구조 분해</h3>
<blockquote>
<p>배열을 만들었다.</p>
</blockquote>
<pre><code class="language-js">let data = [&quot;뚱이&quot;, &quot;다람이&quot;, &quot;징징이&quot;]</code></pre>
<blockquote>
<p>구조 분해 할당을 통해 데이터를 다시 담는다.</p>
</blockquote>
<pre><code class="language-Js">[뚱, 다, 징] = data;
console.log(뚱) // &quot;뚱이&quot;
console.log(다) // &quot;다람이&quot;
console.log(징) // &quot;징징이&quot;</code></pre>
<blockquote>
<p>이런 경우도 가능함</p>
</blockquote>
<pre><code class="language-js">const [a,b] = [1,2]
console.log(a) // 1
console.log(b) // 2</code></pre>
<p>위 경우는 <code>useState</code>  에서 익숙히 본 모양</p>
<h3 id="❓-객체-구조-분해">❓ 객체 구조 분해</h3>
<blockquote>
<p>객체를 만들었다.</p>
</blockquote>
<pre><code class="language-js">let profile = {name: &quot;뚱이&quot;, age: 11}</code></pre>
<blockquote>
<p>원래 사용했던 방식대로는 <code>profile.name</code> 과 <code>profile.age</code> 을 통해 필요한 값을 꺼내 왔다.</p>
<p>이 방식을 아래처럼 바꿔 사용하면 편하다</p>
</blockquote>
<pre><code class="language-js">const {name, age} = profile
console.log(name) // &quot;뚱이&quot;
console.log(age) // 11</code></pre>
<blockquote>
<p>name 과 age 대신 다른 이름으로 사용도 가능하다</p>
</blockquote>
<pre><code class="language-js">const {name:aaa, age:bbb} = profile
console.log(aaa) // &quot;뚱이&quot;
console.log(bbb) // 11</code></pre>
<h4 id="❓-객체-구조-분해는-이미-사용하고-있었다">❓ 객체 구조 분해는 이미 사용하고 있었다.</h4>
<blockquote>
</blockquote>
<p><code>query</code> 로 데이터를 받아올 때</p>
<pre><code class="language-js">const {data} = useQuery()</code></pre>
<h4 id="❗️-usequery-를-2번-써야하는-경우에는">❗️ useQuery 를 2번 써야하는 경우에는</h4>
<blockquote>
<pre><code class="language-js">const {data} = useQuery(fetch~~1)
const {data:DataTow} = useQuery(fetch~~2)</code></pre>
</blockquote>
<pre><code>DataTow.fetch~~   로 
이름을 지정하여 받아올 수 있다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Optional-Chaning]]></title>
            <link>https://velog.io/@bu_du_dak/Optional-Chaning</link>
            <guid>https://velog.io/@bu_du_dak/Optional-Chaning</guid>
            <pubDate>Sun, 18 Jul 2021 13:44:55 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-optional-chaning-이란">📌 optional-chaning 이란?</h2>
<p>기존의 <code>&amp;&amp;</code> 연산자를 사용해 길어진 코드를 더욱 간결하게 사용하는 연산자</p>
<blockquote>
<p>삼항연산자를 사용</p>
</blockquote>
<pre><code class="language-js">data ? data.fetchProfile : undefined</code></pre>
<p>여기서 <code>data</code> 는 동기적으로 받아오는 데이터인데, 데이터가 오기 전 <code>return</code> 부분에서 화면을 제공해주고 있기에 삼항 연산자를 사용하여 데이터가 있을 때, 없을 때 를 모두 적어주었다.</p>
<blockquote>
<p>&amp;&amp; 연산자 사용</p>
</blockquote>
<pre><code class="language-js">data &amp;&amp; data.fetchProfile</code></pre>
<p>&amp;&amp;연산자에서는 <code>data</code> 가 없을때, 자동으로 <code>undefined</code>를 반환</p>
<blockquote>
<p>optional-chaning 사용</p>
</blockquote>
<pre><code class="language-js">data?.fetchProfile</code></pre>
<p><code>optional-chaning</code>은 ? 연산자 앞 객체의 참조가 <code>undefined</code> 혹은 <code>null</code> 이면 <code>undefined</code> 를 <code>return</code> 해준다.</p>
<blockquote>
</blockquote>
<p>❗️ 내가 이해한 방식은 <code>fetchProfile 관련 data 있어? 있으면 주고 없으면 undefined줘</code> 로 이해했다 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GraphQL]]></title>
            <link>https://velog.io/@bu_du_dak/GraphQL</link>
            <guid>https://velog.io/@bu_du_dak/GraphQL</guid>
            <pubDate>Sun, 18 Jul 2021 05:22:25 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-graphql-">📌 GraphQL ?</h2>
<p>❗️ <code>GraphQL</code> 은 페이스북에서 만든 <code>query</code> 언어
<code>web</code> 이나 <code>app</code>을 구현할때 <code>API</code> 를 사용하여 기능을 구현하는데, 기능이 필요할 때 사용자가 필요한 데이터만을 골라 받아 사용 할 수 있게 해주는 것이 <code>graphql</code></p>
<blockquote>
<p>❓ <code>query</code> 언어란?</p>
<ul>
<li><code>query</code> 는 데이터베이스(<code>DB</code>)에 정보를 요청하는 것</li>
</ul>
</blockquote>
<ul>
<li>웹 서버에 정보를 보여달라는 요청에 의한 처리를 <code>query</code> 라고 함<blockquote>
<p>쉽게 말해, <code>DB</code> 에 접속해, 데이터를 입력, 조회, 수정, 삭제 하고 싶을때 <code>DB</code> 에 명령을 내리는 것이 <code>query</code></p>
</blockquote>
</li>
</ul>
<hr>
<h4 id="🕹-설치방법">🕹 설치방법</h4>
<pre><code>// 사용할 폴더에서 
`npm install @apollo/client graphql` </code></pre><h4 id="🕹-초기세팅">🕹 초기세팅</h4>
<p>❗️ 설치한 폴더의 _app.js 내부에 작성</p>
<p><img src="https://images.velog.io/images/bu_du_dak/post/26890310-f892-481a-b808-b265cb11b8ed/%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-07-18%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.44.54.png" alt=""></p>
<hr>
<h2 id="📌-graphql의-구조">📌 GraphQL의 구조</h2>
<p>graphql 은 <strong>CRUD</strong> 를 <code>query</code> 와 <code>mutation</code> 으로 나누었는데,</p>
<ul>
<li><p>데이터를 변조(<strong>C</strong>reate, <strong>U</strong>pdate, <strong>D</strong>elete)하는 Mutation</p>
</li>
<li><p>데이터를 읽는(<strong>R</strong>ead)하는 Query </p>
</li>
</ul>
<p>두 가지로 나뉘어 있다.</p>
<hr>
<h2 id="📌-apollo-client">📌 Apollo-Client</h2>
<p><code>graphql</code>은 <code>query</code> 언어이기에 자체적으로 할 수 있는 것이 없다.</p>
<p>이를 구체적으로 활용할 수 있도록 도와주는 라이브러리들이 있는데 나는 그 중 <code>Apollo-client</code> 를 사용한다</p>
<h4 id="❓-apollo-">❓ Apollo ?</h4>
<p><code>Apollo</code> 는 <code>gql</code> 의 <code>라이브러리</code> 중 하나로, 상태 관리 플랫폼이다.</p>
<p><code>Apollo</code> 를 통해 <code>query</code> 나 <code>mutation</code> 을 전송해 API 서버에서 데이터를 전해 받게 되면, 사용자는 네트워크단의 HTTP 요청을 번거롭게 신경 쓸 필요가 없어진다.</p>
<p>한마디로 정리하면 편하다</p>
<hr>
<h2 id="📌-graphql의-요소">📌 GraphQL의 요소</h2>
<ul>
<li><code>query</code> 는 <code>DB</code> 로 부터 데이터를 얻어오기 위해 사용한다.<blockquote>
</blockquote>
<img src="https://images.velog.io/images/bu_du_dak/post/9b4acd35-8de4-4cad-aee6-4024d4e94474/%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-07-18%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.10.52.png" alt=""><blockquote>
</blockquote>
<code>query</code> 에서 받아올 정보를 정하고<blockquote>
</blockquote>
<img src="https://images.velog.io/images/bu_du_dak/post/02700bdf-04c6-4433-b412-2894cbd8d8ca/%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-07-18%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.13.20.png" alt=""><blockquote>
</blockquote>
변수에 담아 사용할 수 있다.</li>
</ul>
<ul>
<li><code>mutation</code> 은 <code>서버</code>,<code>DB</code> 의 데이터를 변경하기 위해 사용한다.</li>
</ul>
<blockquote>
</blockquote>
<p><img src="https://images.velog.io/images/bu_du_dak/post/fd1b0ce4-12aa-4e88-b427-5b934d3bd329/%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-07-18%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.11.04.png" alt=""></p>
<blockquote>
<p>여기서 <code>deleteBoard</code> 가 받는 필수요소 <code>boardId</code> 의 이름을 <code>aaa</code>로 지정하여 연결하였다.</p>
<p><img src="https://images.velog.io/images/bu_du_dak/post/1d7f3fc8-fcaf-4379-8e83-9630e5b525d3/%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-07-18%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.15.16.png" alt=""></p>
</blockquote>
<ul>
<li>위의 <code>fetchBoard</code> 에서 가져온 정보들이 담겨있는 <code>{data}</code>는 </li>
</ul>
<p><img src="https://images.velog.io/images/bu_du_dak/post/42e5c572-44fe-4e78-9182-6f326544bc7f/%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-07-18%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.20.54.png" alt=""></p>
<p>이렇게 화면에 직접 호출해 사용할수도 있다.</p>
<hr>
<h2 id="📌-graphql-실사용">📌 GraphQL 실사용</h2>
<p>PlayGround의 입력 정보를 확인하며 사용하게 되는데,</p>
<blockquote>
</blockquote>
<pre><code class="language-js">const CREATE_BOARD = gql`            // CREATE_BOARD 라는 상수에 gql 을 담아준다
    mutation qqq($aaa:String, $bbb:String, $ccc:String, $ddd:String){                
                        // gql 의 mutation을 사용 할거고 얘이름은 qqq다,
                        // qqq가 받는 인자는 여러개가 있는데 그중  
                        // writer,password,title,contents를 쓸거고 얘네의 타입은 이거다.
        createBoard(            // mutation 중 createBoard 기능을 쓸건데,
            writer : $aaa,        // createBoard 안의 인자들은 이거 이거인데, 값을 넣어줄때 사용할 이름은 $aaa, $bbb, $ccc ... 이다
            password : $bbb,
            title : $ccc,
            contents : $ddd,
    ){
        message                // return값으로는 이걸 받겠다.
    }
}
`</code></pre>
<blockquote>
<p>❗️ gql상수 (CREATE_BOARD) 가 모두 대문자로 쓰이는 것은 관례라고 한다</p>
</blockquote>
<blockquote>
<p>위에서 만든 CREATE_BOARD (gql 상수)를 이용해 <code>useMutation</code>을 만든다</p>
</blockquote>
<pre><code class="language-js">const [createBoard] = useMutation(CREATE_BOARD)
//(위 createBoard는 mutation을 실행하기 위한 이름, 아무거나 상관 없음) </code></pre>
<blockquote>
<p>버튼을 눌렀을때 실행되는 함수에서 위의 <code>mutation</code> 코드 실행</p>
</blockquote>
<pre><code class="language-js">function onClickPost(){
    createBoard({
        variables: {     // 위에서 지정한 writer,password ... 의 연결 이름들을 통해 작성
            aaa : &quot;뚱이&quot;,
                  bbb : &quot;123&quot;,
                  ccc : &quot;안녕&quot;,
                  ddd : &quot;난 뚱이야&quot;,
        }
    })
}</code></pre>
<p>하지만 위의 방식으로 작성하면 항상 고정된 값만 데이터에 들어가기에 <code>state</code> 를 이용하여 실사용한다.</p>
<h2 id="📌-async--await">📌 async / await</h2>
<p><code>gql</code> 을 사용하면 요청에 대한 응답으로 받은 <code>객체</code>를 <code>변수</code>에 담아 사용하게 된다.</p>
<p>여기서 응답 결과를 변수에 담기 위해서는 통신이 완료될 때까지 기다려야하는데,</p>
<p>응답 결과를 받기도 전에 페이지 구성이 먼저 되어 응답결과가 화면에 출력되지 않는 경우가 생기기 때문.</p>
<p>그렇기에 통신이 완료될 때까지 기다리게 하는 명령이 <code>async</code> / <code>await</code></p>
<pre><code class="language-js">async function onClickPost(){
    const result = await createBoard({
        variables : {
            aaa : &quot;뚱이&quot;,
        bbb : &quot;123&quot;,
              ccc : &quot;안녕&quot;,
              ddd : &quot;난 뚱이야&quot;
        }
    })
}</code></pre>
<hr>
<h2 id="📌-try--catch">📌 try / catch</h2>
<p><code>Backend</code> 컴퓨터의 문제나, 게시물의 갑작스러운 삭제 등 여러가지 실패 가능성이 생긴다.</p>
<p>그렇기에 실패에 대한 처리도 필요하다.</p>
<pre><code class="language-js">try{
    await createBoard({
        variables : {
            aaa : &quot;뚱이&quot;,
        bbb : &quot;123&quot;,
              ccc : &quot;안녕&quot;,
              ddd : &quot;난 뚱이야&quot;
        }
    })
} catch(error){
  alert(error.message)    // Backend 개발자가 보내는 실패 메세지
}</code></pre>
<p><code>try</code> 내부의 내용이 실행이 끝까지 되지 않을 경우 <code>catch</code> 이후의 내용이 실행된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[API]]></title>
            <link>https://velog.io/@bu_du_dak/API</link>
            <guid>https://velog.io/@bu_du_dak/API</guid>
            <pubDate>Sat, 17 Jul 2021 16:23:37 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-api-란">📌 API 란</h1>
<p><code>API</code> 는 <code>HTTP 요청</code> 을 <code>Backend</code> 컴퓨터에 보냈을때 실행되는 <code>Backend</code> 기능</p>
<blockquote>
</blockquote>
<p>즉, <code>Backend</code> 개발자가 만든 <code>함수</code></p>
<blockquote>
</blockquote>
<p><code>API</code> 에 <em>요청 시 <strong>보내는 데이터</strong></em> = <em>API 함수에 들어가는 <strong>인자</strong></em></p>
<blockquote>
</blockquote>
<p><em>응답 시 <strong>받는 데이터</strong></em> = <em>API 함수의 <strong>return 데이터</strong></em></p>
<hr>
<h2 id="📌-api-종류">📌 API 종류</h2>
<h3 id="🕹-rest-api">🕹 rest-API</h3>
<blockquote>
<h4 id="❗️-특징">❗️ 특징</h4>
</blockquote>
<ul>
<li><code>API</code> 의 이름이 홈페이지 주소 처럼 생김
  ex) <a href="https://naver.com/board/1">https://naver.com/board/1</a><blockquote>
</blockquote>
</li>
<li>응답 결과로 <code>API</code> 에서 보내주는 모든 데이터를 받아야만 한다<blockquote>
</blockquote>
</li>
<li><strong><code>rest-API</code></strong> 에 요청 담당 - <strong><code>axios</code></strong></li>
</ul>
<blockquote>
<h4 id="❗️-crudcreat-update-delete-read">❗️ CRUD(C<strong>reat</strong> U<strong>pdate</strong> D<strong>elete</strong> R<strong>ead</strong>)</h4>
</blockquote>
<ul>
<li>생성 <code>API</code> : <code>Post</code> <blockquote>
</blockquote>
</li>
<li>수정 <code>API</code> : <code>Put</code> <blockquote>
</blockquote>
</li>
<li>삭제 <code>API</code> : <code>Delete</code> <blockquote>
</blockquote>
</li>
<li>조회 <code>API</code> : <code>Get</code> </li>
</ul>
<blockquote>
<h4 id="❗️-사용법">❗️ 사용법</h4>
<p><img src="https://images.velog.io/images/bu_du_dak/post/92720cdd-660d-4f33-a754-5fc339b16e80/%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-07-18%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.49.18.png" alt=""></p>
</blockquote>
<hr>
<h3 id="🕹-graphql-api">🕹 graphql-API</h3>
<blockquote>
<h4 id="❗️-특징-1">❗️ 특징</h4>
</blockquote>
<ul>
<li><code>API</code> 의 이름이 일반적 함수처럼 생김
  ex) proflie(&quot;철수&quot;)<blockquote>
</blockquote>
</li>
<li>응답 결과로 <code>API</code> 에서 보내주는 데이터 중 필요한 것만 골라 받을 수 있다<blockquote>
</blockquote>
</li>
<li><strong><code>graphql-API</code></strong> 에 요청 담당 - <strong><code>apollo-client</code></strong></li>
</ul>
<blockquote>
<h4 id="❗️-crudcreat-update-delete-read-1">❗️ CRUD(C<strong>reat</strong> U<strong>pdate</strong> D<strong>elete</strong> R<strong>ead</strong>)</h4>
</blockquote>
<p>조회 <code>API</code> 만 <code>query</code>를 사용한다</p>
<blockquote>
<blockquote>
</blockquote>
</blockquote>
<ul>
<li>생성 <code>API</code> : <code>Mutation</code> <blockquote>
<blockquote>
</blockquote>
</blockquote>
</li>
<li>수정 <code>API</code> : <code>Mutation</code> <blockquote>
<blockquote>
</blockquote>
</blockquote>
</li>
<li>삭제 <code>API</code> : <code>Mutation</code> <blockquote>
</blockquote>
</li>
<li>조회 <code>API</code> : <code>Query</code> </li>
</ul>
<blockquote>
<h4 id="❗️-사용법-1">❗️ 사용법</h4>
<p><img src="https://images.velog.io/images/bu_du_dak/post/24758850-3a0e-47fa-ae24-7cfb9d0ce982/%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-07-18%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.16.14.png" alt=""></p>
</blockquote>
<hr>
<h2 id="📌-api-명세서">📌 API 명세서</h2>
<blockquote>
</blockquote>
<p><code>API</code> 명세서 =  사용 설명서</p>
<blockquote>
</blockquote>
<p><code>Backend</code> 개발자가 만든 API에 대한 정보를 확인하기 위해서 필요하다</p>
<blockquote>
<blockquote>
<p><code>API</code> 별 명세서</p>
</blockquote>
</blockquote>
<ul>
<li><code>rest-API</code> =&gt; <code>Swagger</code><blockquote>
<blockquote>
</blockquote>
</blockquote>
</li>
<li><code>graphql-API</code> =&gt; <code>PlayGround</code></li>
</ul>
<hr>
<h2 id="📌-api-요청-결과-타입--json">📌 API 요청 결과 타입 = JSON</h2>
<pre><code class="language-js">{
    writer: &quot;듀듕&quot;,
       title: &quot;부부붕&quot;,
       contents: &quot;내요옹&quot;,
}</code></pre>
<p><code>API</code> 의 요청 결과는 <code>js</code> 의 객체(<code>object</code>)처럼 표기되는데,
이 앞글자들을 따서 <code>API</code> 결과 타입을 <strong><code>JSON</code></strong> 이라고 부른다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Router]]></title>
            <link>https://velog.io/@bu_du_dak/Router</link>
            <guid>https://velog.io/@bu_du_dak/Router</guid>
            <pubDate>Fri, 16 Jul 2021 17:00:32 GMT</pubDate>
            <description><![CDATA[<h3 id="🕹-설치방법">🕹 설치방법</h3>
<pre><code>yarn create next-app
// NextJs 설치 후 프로젝트 이름 입력 ex) Class
</code></pre><h2 id="📌-router-를-단순히-이해해-본다면">📌 <code>Router</code> 를 단순히 이해해 본다면</h2>
<blockquote>
<p><code>router</code> 는 페이지 이동과 관련된 기능을 갖고있는 <code>객체</code></p>
</blockquote>
<hr>
<p><img src="https://images.velog.io/images/bu_du_dak/post/b470c72d-9759-40b9-a5e5-1e4758be777a/%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-07-16%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.56.48.png" alt="">
<code>useRouter</code> 를 통해 기능을 불러오고,</p>
<p><img src="https://images.velog.io/images/bu_du_dak/post/39a96c4e-7e25-4891-b9c5-a2da75545949/%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-07-16%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.56.33.png" alt="">
<code>router</code> 객체 정의 이후 <code>router</code> 가 가진 객체 기능을 사용 할 수 있게 된다.
가장 많이 사용하는 기능으로는 <code>push()</code> 가 있다.</p>
<hr>
<blockquote>
</blockquote>
<p><img src="https://images.velog.io/images/bu_du_dak/post/546a990c-bfcf-4f3e-899a-c06fc7162f6f/%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-07-17%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.45.43.png" alt=""></p>
<blockquote>
</blockquote>
<p>위 처럼 버튼 클릭을 통해 <code>/detail/10</code> 페이지로 이동하는 기능을 만들어 줄 수 있다.
이처럼 객체를 사용하여 <code>A 페이지</code>에서 <code>B 페이지</code>로 이동할 때 <strong><em>B페이지로 라우팅</em></strong> 한다고 표현한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[State]]></title>
            <link>https://velog.io/@bu_du_dak/State</link>
            <guid>https://velog.io/@bu_du_dak/State</guid>
            <pubDate>Thu, 15 Jul 2021 15:23:45 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/bu_du_dak/post/36ec61f2-c225-4111-b79c-dcf31c6ab184/Reactlogo.png" alt=""></p>
<h3 id="📌-state-개념">📌 State 개념</h3>
<blockquote>
</blockquote>
<p>지금까지 <code>js</code> 에서 데이터를 <code>변수</code> 에 담아왔다.</p>
<blockquote>
<p>React 에서는</p>
</blockquote>
<ul>
<li><code>state</code> 는 <code>컴포넌트</code> 에서 데이터를 담기위한 <code>변수</code> 이다.<blockquote>
</blockquote>
</li>
<li><code>setState</code> 는 <code>state</code> 에 담긴 변수를 바꿔주는 기능을 갖고 있다.<blockquote>
</blockquote>
</li>
<li><code>useState</code> 는 <code>컴포넌트</code>에서 사용하는 변수를 만들어준다.</li>
</ul>
<p><img src="https://images.velog.io/images/bu_du_dak/post/448353cd-f30c-4a70-a237-2ed4037e52b0/%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-07-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.54.35.png" alt=""></p>
<p>즉, <code>const [변수명] = 변수만드는기능(담을내용)</code> 이 되는데, 위의 예시에는
<code>const [변수명, 변수를바꾸는기능] = 변수를만드는기능(담을내용)</code> 이 되는 것이다.</p>
<hr>
<h3 id="📌-state의-사용-이유">📌 State의 사용 이유</h3>
<blockquote>
<p><code>js</code> 의 <code>let</code> 은 <code>let</code> 의 값이 변경이 되었을 때 데이터 부분은 변경되지만 화면에는 반영되지 않는다는 단점이 있다. </p>
</blockquote>
<p><img src="https://images.velog.io/images/bu_du_dak/post/5b91c626-9623-4d9f-afd1-0b8e34390dde/%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-07-16%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.12.26.png" alt=""></p>
<blockquote>
<p>하지만 <code>state</code> 를 사용할 경우, <code>setState()</code> 가 값을 변경해줌과 동시에, 변경된 데이터로 화면을 다시 그리는 명령이 실행되어 화면에 바로 반영 된다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/bu_du_dak/post/e0dd6fef-0bad-4de6-8743-450c27e3cacd/%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-07-16%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.12.14.png" alt=""></p>
<hr>
<h3 id="📌-많이-쓰이는-방식">📌 많이 쓰이는 방식</h3>
<p>지금까지 학습과정에서 <code>state</code> 는 회원가입이나 게시물/댓글 작성 등 <code>서버 컴퓨터</code> 에게 전송하기 위해 많이 사용되었다.</p>
<p><img src="https://images.velog.io/images/bu_du_dak/post/224c64ce-6ff4-4bcf-a309-7c6d5be1d207/%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-07-16%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.18.31.png" alt=""></p>
<blockquote>
<p>위 처럼 <code>input</code> 에 <code>handleChangeId</code> , <code>handleChangePw</code> 를 주어, 입력되는 값을 <code>value</code> 에 담은 후 <code>setId</code> <code>setPw</code> 에 넣어주어,</p>
</blockquote>
<p>값이 입력됨과 동시에 그 값을 <code>id</code> <code>pw</code> 에게 줄 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React 컴포넌트 구조]]></title>
            <link>https://velog.io/@bu_du_dak/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@bu_du_dak/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Thu, 15 Jul 2021 14:41:12 GMT</pubDate>
            <description><![CDATA[<p>지금까지 사용해온 <code>HTML</code> <code>CSS</code> <code>javaScript</code> 는 이 세가지만으로 페이지를 구성해왔었다. ex) <code>index.html</code> <code>style.css</code> <code>count.js</code> 등등</p>
<p>하지만 <code>React</code> 를 사용하기 시작한 후로 그 구조가 조금 달라졌다.</p>
<p><strong>_❗️ 지금부터 예시로써 사용하는 폴더구조, 명칭(<code>container</code> <code>presenter</code>)은 사용자 마다 다르다.
_</strong></p>
<h3 id="📌-폴더구성">📌 폴더구성</h3>
<p><img src="https://images.velog.io/images/bu_du_dak/post/d0528d49-8aa6-4d6a-ae3c-9c3e51ab1be7/%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-07-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.53.16.png" alt=""></p>
<p><code>React</code> 설치 후 기본적 폴더 구조는 위와 같고,</p>
<p><img src="https://images.velog.io/images/bu_du_dak/post/b6f5d817-9ec5-4a9e-a348-60e10dc4dbb2/%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-07-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.55.48.png" alt=""></p>
<blockquote>
<p><code>pages</code> 는 쉽게 생각해서 <code>components</code> 들을 불러와 화면에 보여주며,</p>
</blockquote>
<p><code>~.container.tsx</code> 는 기능적 요소들이, </p>
<blockquote>
</blockquote>
<p><code>~.presenter.tsx</code> 는  <code>index.html</code> 과 같이  화면에 보여질 구조,</p>
<blockquote>
</blockquote>
<p><code>~.styles.ts</code> 는 이름대로 <code>css</code> 처럼 꾸며주는 요소들이 들어간다. </p>
<blockquote>
</blockquote>
<p>❗️(확장자는 <code>typescript</code>를 사용하고 있어 .<code>js</code>가 아니다.)</p>
<p>요약하면 <code>pages</code> 내부의 파일이 <code>src</code> 안 <code>components</code> 속 <code>board</code>폴더의 파일들을 불러와 내보내준다.</p>
<hr>
<h3 id="📌-indexjs">📌 index.js</h3>
<p><code>boards 폴더</code> 안의 <code>new 폴더</code> 내부의 <code>index.tsx</code> 는 아래와 같이 구성 되어있다.</p>
<p><img src="https://images.velog.io/images/bu_du_dak/post/ab875c3c-19df-4a52-9c3f-a89991562544/%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-07-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.01.43.png" alt=""></p>
<p>형태만 본다면 <code>javaScript</code> 에서의 <code>function(){}</code> 이 생각난다.</p>
<p><code>export</code> 를 통해 외부로 내보내지고 <code>default</code> 가 붙어 <code>BoardWritePage</code> 만을 내보내는것으로 취급된다.
<code>return</code> 값으로 <code>BoardWrite</code> 을 내보내는데 <code>BoardWrite</code> 컴포넌트의 내용을 화면으로 내보내준다.</p>
<hr>
<h3 id="📌-presenterjs-와-stlyesjs">📌 ~.presenter.js 와 ~.stlyes.js</h3>
<p><code>~.presenter.js</code> 와 <code>~.stlyes.js</code> 는 <code>HTML</code> 과 <code>CSS</code> 로 생각하면 편하다.</p>
<p><img src="https://images.velog.io/images/bu_du_dak/post/2446781e-e844-4077-b283-ceb417023377/%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-07-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.33.25.png" alt=""></p>
<p><img src="https://images.velog.io/images/bu_du_dak/post/b3c96acc-b30f-419c-977d-042c18cfd575/%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-07-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.32.15.png" alt=""></p>
<p><code>import</code> 를 통해 <code>~.stlyes.js</code> 와 연결시켜주어 사용한다</p>
<hr>
<h3 id="📌-containerjs">📌 ~.container.js</h3>
<p><code>~.container.js</code> 는 기능적 요소들을 담아 <code>~.presenter.js</code> 에게 전달한다.</p>
<p><img src="https://images.velog.io/images/bu_du_dak/post/d7b927f3-706c-47d0-b86e-ad6562639db8/%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-07-15%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.22.04.png" alt=""></p>
<blockquote>
<p>여기서 주목해야 할 점은 <code>~.container.js</code> 파일에서 <code>~.presenter.js</code> 파일을 <code>return</code> 한다는 것이다. </p>
</blockquote>
<p>❗️ 최종적으로 화면에 보여지는 <code>index.js</code> 는  <code>~.presenter.js</code> 를 <code>return</code> 하는  <code>~.container.js</code> 를 <code>return</code> 한다.</p>
<blockquote>
</blockquote>
<p>즉, <code>index.js</code> 의 <code>return</code> 값은 <code>~.container.js</code> 다</p>
]]></description>
        </item>
    </channel>
</rss>