<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>natural-nine.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 14 Aug 2022 12:14:58 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. natural-nine.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/natural-nine" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[08-08 ~ 08-13 WIL(Weekly I Learned) ]]></title>
            <link>https://velog.io/@natural-nine/08-08-08-13-WILWeekly-I-Learned</link>
            <guid>https://velog.io/@natural-nine/08-08-08-13-WILWeekly-I-Learned</guid>
            <pubDate>Sun, 14 Aug 2022 12:14:58 GMT</pubDate>
            <description><![CDATA[<p>99일이란 항해속에 드디어 하선을 하게 되었다. 개발공부를 하면서 가장 좋았던 점과 힘들었던 점을 한 개씩 뽑으라면 오류를 해결할 때와 오류에 막혔을 때 라고 말하고 싶다. 그리고 개발공부를 하면서 느낀건 개발이란 희로애락 이라는 것. </p>
<p>이번주에는 이력서를 쓰고 모의면접을 통해 느낀 점과 보완해야할 점 5가지를 추려보았다.</p>
<ol start="0">
<li><p>이력서 작성 시작.</p>
<p>역시나 어려운 자소서. 어렵사리 작성은 다 했고 이제 보완하면서 많이 지원을 해야지. </p>
</li>
<li><p>자바스크립트 이론에 대해서 부족하다.</p>
<p> 모의면접을 통해 자바스크립트의 이론이 부족하다는 것을 다시 한번 느끼게 되었다. 클로저, 이벤트 버블링, 실행컨텍스트 등.. 아직 정확히 답변할 수준은 안된다. 다행히 스터디에서 코어 자바스크립트라는 책으로 이론 공부를 해왔기에 큰 어려움은 없을 거 같다. </p>
</li>
<li><p>취업이냐, 프로젝트를 하나 더 하냐</p>
<p> 사실 고민이 되는 부분. 여기저기 얘기를 들어보면 취업이 먼저라고 한다.</p>
</li>
<li><p>여태껏 해왔던 것을 되돌아보자.</p>
<p>여태껏 프로젝트하면서 해왔던 것을 복습할 겸 다시 공부해보자. </p>
</li>
<li><p>아직 갈 길이 멀다.</p>
<p> 리액트만 공부해봤다. 여기저기 지원하려고 보니까 typescript, native, vue 등등 우대사항이 많았다. 시간될 때 틈틈히 공부해야지</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[07-25 ~ 07-30 WIL(Weekly I Learned)]]></title>
            <link>https://velog.io/@natural-nine/07-25-07-30-WILWeekly-I-Learned</link>
            <guid>https://velog.io/@natural-nine/07-25-07-30-WILWeekly-I-Learned</guid>
            <pubDate>Sun, 31 Jul 2022 11:23:13 GMT</pubDate>
            <description><![CDATA[<p>실전프로젝트 5주차 이제 끝이 보여간다. 지금까지 거의 완성단계에 들어갔으나 아직까지 오류나 수정사항이 꽤 있다. 그 중 하나로 카카오 맵 지도 렌더링에서 문제가 발생했다. 뭔가가 될 듯 말 듯 하나하나 뜯어보고 있다. 꼭 하겠다. 렌더링에 문제 없게끔...</p>
<p>이제 남은 건 반응형과 등록된 8장의 이미지 수정만 남았다. 열심히 해보자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[07-18 ~ 07-23 WIL(Weekly I Learned)]]></title>
            <link>https://velog.io/@natural-nine/07-18-07-23-WILWeekly-I-Learned</link>
            <guid>https://velog.io/@natural-nine/07-18-07-23-WILWeekly-I-Learned</guid>
            <pubDate>Sun, 24 Jul 2022 13:56:47 GMT</pubDate>
            <description><![CDATA[<p>실전프로젝트 4주차 끝 이번 주는 새로운 것을 했다기 보단 여태까지 했던 것을 수정하고 다시 만들었다. 작업 막바지에 들어가니 한 가지 걸리는 것이 있는데, 작업할 때 컴포넌트를 재사용을 많이 하지 못했다. 지난 피드백에서 컴포넌트의 재사용이 중요하다고 피드백을 받았는데, 아직 어떤 방식으로 재사용하는지 감이 안 온다. </p>
<p>이제 배포가 2일 밖에 남지 않았다. 반응형으로도 만들어야 하고 손 볼 곳도 아직 많이 남았다. 열심히 해보자</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[07-23-2022 TIL // Link와 Navigate 차이?]]></title>
            <link>https://velog.io/@natural-nine/til-hakq96zr</link>
            <guid>https://velog.io/@natural-nine/til-hakq96zr</guid>
            <pubDate>Sat, 23 Jul 2022 12:27:53 GMT</pubDate>
            <description><![CDATA[<p>리액트를 협업을 한창 하는 중에 페이지를 이동할 때 Link와 Navigate를 둘 다 사용되었는데 문득 둘의 차이점이 궁금했다. 둘 다 페이지를 이동할 때 쓰는 것인데 도대체 둘의 차이점은 뭘까??</p>
<ol start="0">
<li><p>Link</p>
<p>Link는 클릭 시 바로 이동하는 로직 구현에 용이하다고 한다. 예를 들어 디테일 페이지로 이동하는 것들..
react-router-dom 에서 제공되는 Link 는 DOM 에서 a 로 변환됨. a 와 Link 는 지정한 경로로 바로 이동시켜줌.
a 와 Link 의 차이점은 a 는 외부 프로젝트로 이동할 경우 Link 는 프로젝트 내에서 페이지를 전환할 경우</p>
<pre><code class="language-javascript">&lt;Link to=&quot;/page&quot;&gt;&lt;/Link&gt;</code></pre>
<ol>
<li><p>Navigate</p>
<p>함수 호출을 통해 페이지 이동을 한다. 페이지를 이동한다는 것에 공통점이 있지만 차이점도 존재한다.
Navigate는 보통 페이지 전환 시 추가로 처리해야하는 로직이 있을 때 사용한다.
예를 들어 로그인 버튼 클릭 시 백엔드와 통신을하고 Case 별로 나눈 후 다른 페이지를 보여주면 된다.</p>
</li>
</ol>
</li>
</ol>
<pre><code class="language-javascript">const navigate = useNavigate();

const onClick = () =&gt; {
    navigate(&quot;/main&quot;)
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[07-18-2022 TIL // React HTML file 추가, 렌더링]]></title>
            <link>https://velog.io/@natural-nine/til-eb485wcm</link>
            <guid>https://velog.io/@natural-nine/til-eb485wcm</guid>
            <pubDate>Mon, 18 Jul 2022 12:47:47 GMT</pubDate>
            <description><![CDATA[<p>개인정보처리방침과 서비스정책에 대해서 하나의 페이지를 만들어야 했다. html 파일로 만들어졌고 react 내에서 렌더링을 해야하는데 코드가 너무 길어서 어떻게 처리해야 할지 막막해 하다가 구글링을 통해 한방에 오류 없이 해결했다. 단, 이름이 뭔가 꺼림칙하다. dangerous .....</p>
<ol start="0">
<li><p>dangerouslySetInnerHTML</p>
<p> dangerouslySetInnerHTML은 브라우저 DOM에서 innerHTML을 사용하기 위한 react의 대체 방법.
 이름에서 설명하듯 사이트 간 스크립팅 공격에 쉽게 노출될 수 있다고 한다. 
 스크립팅 공격이라 말이 좀 어렵다. </p>
</li>
</ol>
<p>```javascript</p>
<p>const Test = () =&gt; {</p>
<pre><code>  const testHtml = `&lt;p&gt;hello&lt;/p&gt;`

return(&lt;div dangerouslySetInnerHTML={{__html: testHtml}}&lt;/div&gt;)</code></pre><p>}</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[07-11 ~ 07-16 WIL(Weekly I Learned)]]></title>
            <link>https://velog.io/@natural-nine/07-11-07-16-WILWeekly-I-Learned</link>
            <guid>https://velog.io/@natural-nine/07-11-07-16-WILWeekly-I-Learned</guid>
            <pubDate>Sun, 17 Jul 2022 12:50:43 GMT</pubDate>
            <description><![CDATA[<p>실전프로젝트 3주차가 지나갔다. 중간 발표에서 여태껏 했던 기능들을 소개했다. 피드백을 받았는데, 정말 많은 도움이 되는 피드백이었다. 컴포넌트의 재사용의 중요성, 라이프싸이클의 중요성, 깃의 중요성 등등 부족한 점을 알게 되고 더욱 노력해야 하는 것들을 알 수 있었다.</p>
<ol start="0">
<li><p>React Query, Recoil</p>
<p> 지금까지 개인 및 팀 프로젝트에서 리덕스를 사용해왔다. 리덕스에 비동기 통신을 많이 하기때문에 비효율적이라는 지적을 받았다. 비동기 통신과 스토어를 나누기 위해 이번 프로젝트에서는 쿼리와 리코일을 사용해봤다.</p>
<p> React Query, 엄청난 신세계였다. 기존에 비동기 통신을하고 통신한 데이터를 스토어에 옮기고 다시 스토어에 있는 데이터를 불러와서 써왔다. 하지만 쿼리는 통신하자마자 쓸 수 있는 엄청난 간편함이 보였고 코드 또한 많이 짧아졌다. 아직까지 쓸 수 있는 기능은 많지 않지만 계속해서 공부해야 한다.</p>
<p> Recoil, 전역상태관리 Redux에 비해 엄청난 간편함을 제공한다. atom을 만들고 여기저기서 쓸 수 있는 장점이 있지만 아직까지 selector에 대해 공부가 부족하다.</p>
<p> React Query, Recoil 둘이 같이 쓰면 굉장히 좋다고 했는데 아직까지 같이 쓰는 코드를 구현하지 못했다. 좀 더 공부해보자</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[07-14-2022 TIL // github action .env file 처리]]></title>
            <link>https://velog.io/@natural-nine/til</link>
            <guid>https://velog.io/@natural-nine/til</guid>
            <pubDate>Thu, 14 Jul 2022 14:09:39 GMT</pubDate>
            <description><![CDATA[<ol start="0">
<li><p>Github action ci cd </p>
<p> 깃헙 액션을 통해 ci/cd 하던 중 .env에 있는 secret key가 build 되지 않아서 배포된 주소에서 .env에 있는 key 들을 읽어올 수 없어서 에러가 났다. 구글링을 통해 쉽게 에러를 해결할 수 있었다.<br> .yml에 코드를 추가해주면 된다.</p>
</li>
</ol>
<pre><code class="language-javascript">- name: Setting .env
        run: |
          echo &quot;REACT_APP_GOOGLE_CLIENTID=${{ secrets.REACT_APP_GOOGLE_CLIENTID }}&quot; &gt;&gt; .env
          echo &quot;REACT_APP_API_DOMAIN=${{ secrets.REACT_APP_API_DOMAIN }}&quot; &gt;&gt; .env
          echo &quot;REACT_APP_KAKAO_REDIRECT=${{ secrets.REACT_APP_KAKAO_REDIRECT }}&quot; &gt;&gt; .env
          echo &quot;REACT_APP_KAKAO_CLIENTID=${{ secrets.REACT_APP_KAKAO_CLIENTID }}&quot; &gt;&gt; .env
          echo &quot;REACT_APP_NAVER_REDIRECT=${{ secrets.REACT_APP_NAVER_REDIRECT }}&quot; &gt;&gt; .env
          echo &quot;REACT_APP_NAVER_CLIENTID=${{ secrets.REACT_APP_NAVER_CLIENTID }}&quot; &gt;&gt; .env
          echo &quot;REACT_APP_NAVER_STATE_STRING=${{ secrets.REACT_APP_NAVER_STATE_STRING }}&quot; &gt;&gt; .env
          cat .env</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[07-04 ~ 07-09 WIL(Weekly I Learned)]]></title>
            <link>https://velog.io/@natural-nine/07-04-07-09-WILWeekly-I-Learned</link>
            <guid>https://velog.io/@natural-nine/07-04-07-09-WILWeekly-I-Learned</guid>
            <pubDate>Sun, 10 Jul 2022 13:45:18 GMT</pubDate>
            <description><![CDATA[<p>실전프로젝트 2주차가 끝이 났다. 이번에 했던 기능들은 이미지 슬라이드 기능 수정, 이미지 박스내에서 이동, 기타 css 작업을 했다. 이미지 이동을 구현하면서 처음에 react-beautiful-dnd를 사용했다가 깔끔하지 못했고 그 다음에 react-sortable-hoc를 사용했고 마지막으로 react-easy-sort 라는 것을 사용했다. 코드도 굉장히 짧으면서도 간편했다.</p>
<ol start="0">
<li><p>react-beautiful-dnd
 처음에 박스내에서 컨텐츠를 움직이는 것을 구현하려다 이 라이브러리를 알게됐다. 기능을 다 구현하긴 했으나 뭔가 깔끔하지 못한것 확인해보니 하나의 박스내에서 위 아래의 이동은 자연스러우나 옆으로 이동하고 하는게 많이 깔끔하지 못했다</p>
<pre><code class="language-javascript"> const onDragEnd = ({draggableId, destination, source,  }) =&gt; {
     if(!destination) return;
     setMultiImgs((imgArry)=&gt;{
         const copyImg = [...imgArry];
         copyImg.splice(source.index, 1)
         copyImg.splice(destination.index, 0, draggableId)
         return copyImg
     })     
 }
&lt;DragDropContext onDragEnd={onDragEnd}&gt;
                     &lt;ImgBox&gt;
                         {multiImgs.map((i, idx)=&gt;(
                            &lt;Droppable droppableId={i}&gt;
                                 {(provided, snapshot)=&gt;(
                                     &lt;div key={idx} ref={provided.innerRef} {...provided.droppableProps}&gt;
                                     &lt;Draggable key={i} draggableId={i} index={idx}&gt;
                                         {(provided, snapshot)=&gt;(
                                             &lt;div 
                                             ref={provided.innerRef}  
                                             {...provided.draggableProps}
                                             {...provided.dragHandleProps} 
                                             key={idx}&gt;
                                                 &lt;Img  src={i} alt={`${i}-${idx}`}/&gt;
                                                 &lt;DeleteIcon  onClick={()=&gt; deleteImage(idx)} /&gt;
                                             &lt;/div&gt;
                                         )}
                                     &lt;/Draggable&gt;
                                     &lt;/div&gt;
                                 )}
                            &lt;/Droppable&gt; 
                         ))}
                     &lt;/ImgBox&gt;
 &lt;/DragDropContext&gt;</code></pre>
<p> 사용해야할 컴포넌트는 DragDropContext, Droppable, Draggable 총 3가지 주의할 점은 함수를 호출해야 한다. DragDropContext 최상단 움직임을 감지할 박스
 Droppable 움직이는 박스
 Draggable 움직이는 컨텐츠</p>
<p> 깔끔하지 못했던 문제점은 드래그 되고 완료 될 때 index 값의 수정이 이루어져서 그런거 같다.</p>
</li>
<li><p>react-easy-sort</p>
<p> 위에 문제점을 고쳐보고자 구글링을 많이 해봤다. 그 결과 굉장히 심플하면서 최신이고 가장 깔끔한 움직임을 할 수 있는 라이브러리이다. 단 설치할 때 문제점은 array-move와 같이 사용해서 설치를 해야하는데 최신버전인 4.0.0은 오류가 났다. 그래서 3.0.1로 다운그레이드를 해보니 정상적으로 잘 작동됐다.</p>
</li>
</ol>
<pre><code class="language-javascript">  &lt;SortableList
      onSortEnd={onSortEnd}
      className={classes.root}
      draggedItemClassName={classes.dragged}
    &gt;
      {items.map(({ name, image }) =&gt; (
        &lt;SortableItem key={name}&gt;
          &lt;div className={classes.item}&gt;
            &lt;Avatar
              className={classes.image}
              alt={name}
              src={image}
              imgProps={{ draggable: false }}
            /&gt;
            &lt;Fab
              color=&quot;primary&quot;
              size=&quot;small&quot;
              className={classes.button}
              aria-label=&quot;like&quot;
              onClick={() =&gt; alert(&quot;Woof!&quot;)}
            &gt;
              &lt;FavoriteIcon /&gt;
            &lt;/Fab&gt;
          &lt;/div&gt;
        &lt;/SortableItem&gt;
      ))}
    &lt;/SortableList&gt;</code></pre>
<p>위에 코드는 <a href="https://codesandbox.io/s/react-easy-sort-images-demo-486qk?file=/src/App.tsx:10024-10763">https://codesandbox.io/s/react-easy-sort-images-demo-486qk?file=/src/App.tsx:10024-10763</a> 에서 가져왔다.
반드시 사용해야할 컴포넌트는 SortableList, SortableItem 두 가지이다. 코드를 다 작성하고 나서 잘 안 됐었는데 css에 pointer-events: none; 를 추가해주니 작 작동됐다.<img src="https://velog.velcdn.com/images/natural-nine/post/22d34617-6712-4e8a-b693-dc5b26a21f00/image.gif" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[06-27 ~ 07-02 WIL(Weekly I Learned)]]></title>
            <link>https://velog.io/@natural-nine/06-27-07-02-WILWeekly-I-Learned</link>
            <guid>https://velog.io/@natural-nine/06-27-07-02-WILWeekly-I-Learned</guid>
            <pubDate>Sun, 03 Jul 2022 13:35:19 GMT</pubDate>
            <description><![CDATA[<p> 실전프로젝트가 시작한지 1주일이 지나갔다. 여태것 내가 작업했던거는 스크롤 애니메이션, 게시글 CRUD, 이미지 슬라이드와 기타 뷰를 만들었다. CRUD 테스트를 못해서 오류상황을 아직 겪어보지 못했으나 슬라이드 부분에서 좀 막혔던 부분이 있었어서 그 부분에 대해 글을 써보려 한다.</p>
<ol start="0">
<li><p>이미지 슬라이드</p>
<p>이지미 슬라이드는 react-slick 이란 라이브러리가 있어서 구현하기 별로 어렵지 않았다. 다만 prev, next 화살표 부분에서 약간의 막히는 부분이 있었다. </p>
<pre><code class="language-javascript"> &lt;ImgBox&gt;
      &lt;Slider {...settings}&gt;
          {listImg.map((item, idx)=&gt;{return(&lt;img src={item}/&gt;)})}
      &lt;/Slider&gt;
 &lt;/ImgBox&gt;

    const settings = {
    infinite: true,
    speed: 500,
    slidesToShow: 1,
    slidesToScroll: 1,
    arrow:true,
    nextArrow: &lt;SampleNextArrow/&gt;,
    prevArrow: &lt;SamplePrevArrow/&gt;
};</code></pre>
<p>slick css 를 import 해와서 prev, next 화살표를 할 수 있었으나 나는 이미지 내에 화살표가 들어가있는 것을 원했다. 그래서 css 부분을 고쳐봤으나 next arrow는 사진 위에 나타나고 prev arrow는 사진에 가려 나오질 않았다. z-index 방식을 고쳐줘도 말이다. 결국 삽질을 수 시간 한 후에 화살표를 커스텀을 해줬다. 다행스럽게도 내가 원하던 화살표가 사진내에 들어가 있는 것을 확인 할 수 있었다.</p>
<p><img src="https://velog.velcdn.com/images/natural-nine/post/69fcb234-5f9d-4200-aa09-c889fe8357e2/image.png" alt=""></p>
</li>
</ol>
<ol>
<li><p>다음 주 작업해야할 것 들</p>
<p>현재 와이어프레임이 변경되서 재차 작업을 해야한다. 어서 Write 뷰와 Detail, Mian View 를 작업해야하고 CRUD 테스트를 빨리 해보고 싶다. 그리고 이미지를 업로드 할 때 업로드 된 이미지 미리보기에서 이미지를 마우스로 클릭해서 box 내에 자유재재로 옮기는 작업을 해야한다. 예전에 이 부분 라이브러리를 본 적이 있어서 비교적 쉽게 접근할 수 있을거 같다. </p>
<p>화이팅 하자.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[07-02-2022 TIL // react-scroll-motion]]></title>
            <link>https://velog.io/@natural-nine/07-02-2022-TIL-react-scroll-motion</link>
            <guid>https://velog.io/@natural-nine/07-02-2022-TIL-react-scroll-motion</guid>
            <pubDate>Sat, 02 Jul 2022 13:57:51 GMT</pubDate>
            <description><![CDATA[<ol start="0">
<li><p>react-scroll-motion</p>
<p>화면을 스크롤할시 애니메이션 효과를 구현해보려 했다. 구글링을 굉장히 많이 해봤는데 방법도 다양했다. CSS 작업으로 하나하나 커스텀을 해주거나 observer를 사용하는 방식, 그 중에서 가장 단순하면서도 효과가 상당한 라이브러리를 찾았다. </p>
<p>이름하여 react-scroll-motion</p>
<p><img src="https://velog.velcdn.com/images/natural-nine/post/9bb25092-c646-4c57-b105-e7b03dffc2bb/image.gif" alt=""></p>
<p>바로 이 방식</p>
<p>코드도 굉장히 간단했다.</p>
<pre><code class="language-javascript">&lt;ScrollContainer snap=&quot;mandatory&quot;&gt;
&lt;ScrollPage&gt;
&lt;Animator animation={batch(Fade(), Sticky(), MoveOut(0, -200))}&gt;
  &lt;MediumText&gt;Let&#39;t me show you scroll animation 😀&lt;/MediumText&gt;
&lt;/Animator&gt;
&lt;/ScrollPage&gt;
&lt;ScrollContainer&gt;</code></pre>
<p>react-scroll-motion을 쓰려면 먼저 ScrollContainer 가 최상단 root가 되어야 하고
그 다음에 ScrollPage 한 화면에 하나씩 page를 넣어준다. 예를들어 4장의 page가 있고 스크롤 애니메이션 효과를 주고 싶다면 ScrollPage page={1}, ScrollPage page={2} 이런식으로 준다. 그 다음 Animator 애니메이션 효과를 어떻게 줄건지 props를 가지고 있다. 그 안에 렌더링할 컴포넌트..</p>
<p>Animator의 props는 여러가지가 있는데,
Fade는 opacity 효과를 가진다.
Move는 어디서부터 어디까지 이동할지를
Sticky는 컴포넌트의 위치를
Zoom 은 얼마나 확대시킬건지를</p>
<p>위에 대략적으로 작성해봤고 다음의 github을 참고하면 된다.</p>
<p><a href="https://github.com/1000ship/react-scroll-motion/blob/master/_readme/docs.md">https://github.com/1000ship/react-scroll-motion/blob/master/_readme/docs.md</a></p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[06-20 ~ 06-25 WIL(Weekly I Learned)]]></title>
            <link>https://velog.io/@natural-nine/06-20-06-25-WILWeekly-I-Learned</link>
            <guid>https://velog.io/@natural-nine/06-20-06-25-WILWeekly-I-Learned</guid>
            <pubDate>Sun, 26 Jun 2022 14:11:01 GMT</pubDate>
            <description><![CDATA[<ol start="0">
<li><p>클론프로젝트 종료</p>
<p> 일주일간 진행된 클론프로젝트가 종료되었다. 지난 실전미니프로젝트에서 아쉬움으로 보냈고 이번 프로젝트를 시작할 때 기대감보단 두려움이 더 컸다. 지난 프로젝트 때 많은 것을 못했고 제자리 걸음을 했기에 또 다시 반복되는가 라는 불안감 때문이었나 보다. 결국 두려움은 끝내 기대감으로 바뀌지 않았고 불안감은 더 커져가는 한 주를 보냈다.</p>
<p> 우리조는 페이스북 클론코딩으로 정했다. 미니프로젝트에 비해 클론코딩은 비교적 와이어 프레임은 짜기 쉬웠다. 내가 맡은 기능은 게시글 CRUD와 무한스크롤, 좋아요 기능 3가지 였다. 시간이 부족해서 였을까 아니면 나의 능력이 부족해서 였을까, 결국 하고 싶은 기능을 많이 구현을 못했고 자신없는 결과물을 제출해야만 했다. </p>
<p> 이렇게 클론프로젝트가 종료되었다. 많은 기능을 완료하지 못했고 새로운 기능을 전혀 하지 못했기 때문에 자신감은 상실됐고 불안감은 더욱 더 커졌다. 이제 남은건 6주간의 실전프로젝트, 이미 할 수 있다 라는 자신감이 상실된 상태이지만 마지막 남은 프로젝트이기때문에 모든 힘을 쏟겠다. 불안감은 자신감으로 바꾸고 두려움을 기대로 바꾸고 싶다.  </p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[06-13 ~ 06-18 WIL(Weekly I Learned)]]></title>
            <link>https://velog.io/@natural-nine/06-13-06-18-WILWeekly-I-Learned</link>
            <guid>https://velog.io/@natural-nine/06-13-06-18-WILWeekly-I-Learned</guid>
            <pubDate>Sun, 19 Jun 2022 13:25:30 GMT</pubDate>
            <description><![CDATA[<ol start="0">
<li><p>미니실전프로젝트 종료</p>
<p> 부트캠프를 시작하고 지금까지 가장 힘들었던 주였다. 여태껏 파이어베이스를 통해 데이터를 주고 받는 것을 하다보니 처음 백엔드와 협업이 굉장히 설레고 기대가 됐다. 하지만 api 설계, 기능 구현 등 많은 에로사항이 있었다. 협업을 통해 많은 실력향상을 꿈꿨던 나로서는 아쉬움이 많이 남는 주였다.</p>
<p>처음 주제를 여차저차 정하고 나서 프론트는 프론트대로 백은 백대로 작업을 진행해갔다. 하지만 진행하려했던 것들은 계획대로 흘러가지 않았고 결국 늦게 프론트 작업을 할 수 밖에 없었다. 시간에 쫓겨 작업을 하다보니 이상한 코드와 중복 코드, 오류를 남발하는 코드 등을 수정하지 못한채 또 주석처리와 클린코드를 전혀 하지 못한채 마무리 지었고 내가 구현하고 싶어했던 기능도 완료하지 못했다. </p>
<p>이번 협업에서 남는게 무엇이라 묻는 다면 딱 하나, 소통이다. 요구할 것이 있으면 정확히 의사전달을 해야하고 항상 많은 얘기과 진행상황을 공유해야한다. 나 포함 우리 조는 많은 소통을 하지 않았던 것 같다. </p>
<p>이제 앞으로 이번 클론코딩을 포함해 2번의 백엔드와 협업이 있는데 정말 아쉬움 없이 힘을 전부 쏟아 잘해보고 싶다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[
[통신] 53 ~ 56]]></title>
            <link>https://velog.io/@natural-nine/%ED%86%B5%EC%8B%A0-53-56</link>
            <guid>https://velog.io/@natural-nine/%ED%86%B5%EC%8B%A0-53-56</guid>
            <pubDate>Tue, 14 Jun 2022 14:39:18 GMT</pubDate>
            <description><![CDATA[<ul>
<li>1일 1로그 100일 완성 IT지식 - Understanding the Digital Word</li>
</ul>
<hr>
<ul>
<li><p>전화부터 와이파이까지, 네트워크의 기본 속성</p>
<p>대역폭(bandwidth) - 모든 네이트워크 가장 기본적인 속성, 네트워크가 데이터를 얼마나 빨리 전송할 수 있는지를 의미</p>
<p>레이턴시(latency) 또는 지연(delay) - 일정 단위의 정보가 시스템을 통과하는 데 걸리는 시간을 측정한 값</p>
<p>지터(jitter) - 지연의 변동성을 뜻 음성과 비디오를 다루는 시스템에서 중요하게 여겨짐</p>
<p>범위(range) - 주어진 기술로 네트워크가 지리적으로 얼마나 확장될 수 있는지를 정의</p>
</li>
</ul>
<hr>
<ul>
<li><p>삐 - 삐 - 추억의 모뎀소리</p>
<p>유선 전화 시스템은 아날로그 음성신호를 전달 따라서 디지털로 보내기 위해선 비트로 변환하는 장치가 필요
변조(mudolation)와 복조(demodulation)를 수행 하는게 모뎀(modem)</p>
<p>데이터 연결을 위해 모뎀을 사용하는 것은 많은 단점이 존재
전용 전화선, 데이터를 연결할지 음성통화를 할지 선택 또한 매우 느린 전송속도</p>
<hr>
</li>
<li><p>킬로바이트에서 메가바이트로</p>
<p>아날로그 전화선 신호 전송속도를 해결하기 위해 
케이블 방송에 사용하는 케이블선 사용 케이블 모델(cable modem) 
tv 케이블은 여러집이 사용하기 때문에 단점 존재 </p>
<p>DSL(digital subscriber loop) 음성 신호를 간섭하지 않은 기법을 사용 </p>
<p>가정용 광케이블 통신망 서비스 전송 손실이 낮은 유리 섬유를 따라 펄스로 보내짐
신호 또한 거리가 매우 길어짐</p>
<hr>
<ul>
<li>학교나 회사에서 사용하는 근거리 네트워크, 이더넷(ethernet)</li>
</ul>
<p>알토(alto)라는 컴퓨터들을 서로 연결하기 위해 이더넷이라는 네트워킹 기술 탄생
초창기에 케이블 방식을 사용</p>
<p>프라이버시에 대해 문제점 같은 건물 및 근거리에 위치한 이더넷을 사용하면 데이터를 엿볼 수 있음
이더넷에서 정보는 패킷(packet)으로 전송됨 패킷은 정보를 담고 있는 일련의 비트 또는 바이트  </p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[06-06 ~ 06-11 WIL(Weekly I Learned)]]></title>
            <link>https://velog.io/@natural-nine/06-06-06-11-WILWeekly-I-Learned</link>
            <guid>https://velog.io/@natural-nine/06-06-06-11-WILWeekly-I-Learned</guid>
            <pubDate>Sun, 12 Jun 2022 13:17:25 GMT</pubDate>
            <description><![CDATA[<ol start="0">
<li><p>Axios</p>
<p> Axios는 nocd.js와 브라우저를 위한 promise 기반 HTTP 클라이언트이다.</p>
<p> 1) 설치하기</p>
<pre><code class="language-javascript"> npm i axios

 yarn add axios</code></pre>
<p>   2) GET 정보를 가져올 때 사용하며 정보를 업데이트나 수정할 수 없음</p>
<pre><code class="language-javascript"> import axios from &#39;axios&#39;;
 axios.get(&#39;https://localgost:3000/user/login&#39;)
   .then((Response)=&gt;{console.log(Response.data)})
   .catch((Error)=&gt;{console.log(Error)})</code></pre>
<p> 3) POST 정보를 업데이트하거나 추가할 때 사용</p>
<pre><code class="language-javascript"> import axios from &#39;axios&#39;;
 axios.post( &#39;url&#39;, 
   { 
    usrId: &#39;Sewon&#39;, 
    email: &#39;sewon@gmail.com&#39; 
    }, 
   { 
    headers:{ 
     &#39;Content-type&#39;: &#39;application/json&#39;, 
     &#39;Accept&#39;: &#39;application/json&#39; 
       } 
     } 
 ) 
   .then((response) =&gt; { console.log(response.data); }) 
   .catch((response) =&gt; { console.log(&#39;Error!) });</code></pre>
<p> 4) DELETE 정보를 제거할 때 사용</p>
<pre><code class="language-javascript"> axios.delete(url,[,config]);</code></pre>
<p> 4)PUT REST 기반 API 프로그램에서 데이터베이스에 저장되어 있는 내용을 갱신하는 목적으로         사용됨</p>
<pre><code class="language-javascript"> axios.put(url[, data[, config]])</code></pre>
<p> PUT메서드는 HTML Form 태그에서 기본적으로 지원하는 HTTP 메서드가 아니다.</p>
<p> PUT메서드는 서버에 있는 데이터베이스의 내용을 변경하는 것을 주 목적으로 하고 있다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[06-11-2022 TIL 미니실전프로젝트]]></title>
            <link>https://velog.io/@natural-nine/06-11-2022-TIL-%EB%AF%B8%EB%8B%88%EC%8B%A4%EC%A0%84%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@natural-nine/06-11-2022-TIL-%EB%AF%B8%EB%8B%88%EC%8B%A4%EC%A0%84%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Sat, 11 Jun 2022 14:17:50 GMT</pubDate>
            <description><![CDATA[<ol start="0">
<li><p>upload page 작업</p>
<p> 미니실전프로젝트에서 upload 작업하기 시작했다. 넘겨줄 데이터는 title, description, expire date, price 등등 어려운 것은 expire date, price다. 
 expire date에는 min을 현재시간을 따와서 해주고 이전시간을 선택하면 alret을 띄워서 못하게 했다. 
 현재시간은 구글링해서 알아냈고</p>
<pre><code class="language-javascript"> let curruntTime = new Date(new Date().getTime() - new Date().getTimezoneOffset() * 60000)
 .toISOString().slice(0, -8);

 2022-06-25-15:15
</code></pre>
</li>
</ol>
<pre><code>
시간을 넘겨주고 가격이 좀 복잡했다. input 입력시 2,000,000 comma를 자동 입력되고 
```javascript

const commaRemovePrice = enteredNum.replace(/,/g,&#39;&#39;)

        console.log(enteredNum, &quot;comma 있음&quot;)
        console.log(commaRemovePrice, &quot;comma 제거&quot;)
--------------------------------------------------------
const priceComma = (e) =&gt; {
        const value = e.target.value;
        const removedCommaValue = Number(value.replaceAll(&quot;,&quot;, &quot;&quot;));
        setEnterdNum(removedCommaValue.toLocaleString());

    }</code></pre><p>comma를 제거 해서 데이터를 넘겨준다. </p>
<p>문제는 디테일 페이지에서 comma를 보여줘야하는데 그게 좀 복잡할거 같다. </p>
<p>내일은 mockapi 만들어서 작업해봐야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[06-19-2022 TIL // 미니프로젝트 시작]]></title>
            <link>https://velog.io/@natural-nine/06-19-2022-TIL-%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@natural-nine/06-19-2022-TIL-%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Fri, 10 Jun 2022 14:49:05 GMT</pubDate>
            <description><![CDATA[<ol start="0">
<li><p>Infinite Scroll</p>
<p> 미니프로젝트에 무한스크롤 기능이 필요할 거 같아서 좀 알아봤다.
 무한스크롤을 하기 위해 array 데이터를 받아오고 useRef를 사용한다.
 또 observer를 사용하는데 observer함수를 만들고 인자로 entry와 io를 사용한다.
 entry에 observer 객체가 들어가고 뭔가 간단한 듯 복잡한게 많다. 확실히 다시 한번 봐야겠다.</p>
</li>
<li><p>object.key() object.value()</p>
<p>메소드는 주어진 객체의 속성 이름들을 일반적인 반복문과 동일한 순서로 순회되는 열거할 수 있는 배열로 반환한다.
예를 들어 </p>
<pre><code class="language-javascript"></code></pre>
</li>
</ol>
<p>const obj = {
    a:5,
      b:3,
      c:4,
}</p>
<pre><code>Object.keys(obj)
// keys arry 반환
Object.values(obj) 
// valuses arry 반환

Object.keys(obj).map((item)=&gt;obj[item])</code></pre><p>```
 2. 미니프로젝트 시작</p>
<pre><code> 대부분 CRUD를 사용하고 게시판 작성 및 댓글 등을 구현하는데 처음엔 우리조 또한 같은 작업을 할거라 생각했다. 계속 회의하고 기능 구현을 어떻게 할지 고민했는데 뭔가 계속 몸집이 불어나갔다.
결국 경매사이트
내가 처음에 생각한 경매사이트는 단순히 입찰버튼을 누르고 많은 입찰버튼을 받은 게시글에 인기순으로 맨 위에 위치하는 걸로 했던 것이다. 계속되던 회의로 입찰버튼을 단순히 누르는게 아니라 가격을 입찰하는 것으로 바뀌었다. 또한 만료날짜도 시간까지 구현해야한다. 다른 조들에 비해 구현해야할 기능이 많기는 하다. 
하지만 할 수 있겠지 해봐야 한다. 해보기 전에 겁이 난다만 못하겠다고 하는 건 아니라고 본다. 이것도 구현하면 한층 더 실력이 올라가겠지</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[06-09-2022 TIL(Splice, React memo) 숙련주차 끝]]></title>
            <link>https://velog.io/@natural-nine/06-09-2022-TILSplice-React-memo-%EC%88%99%EB%A0%A8%EC%A3%BC%EC%B0%A8-%EB%81%9D</link>
            <guid>https://velog.io/@natural-nine/06-09-2022-TILSplice-React-memo-%EC%88%99%EB%A0%A8%EC%A3%BC%EC%B0%A8-%EB%81%9D</guid>
            <pubDate>Thu, 09 Jun 2022 15:31:48 GMT</pubDate>
            <description><![CDATA[<ol start="0">
<li><p>Javascript Splice</p>
<p> Array.prototype.splice()
splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경하는 것.</p>
<pre><code class="language-javascript">
const arry = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;];
arry.splice(1, 0, &quot;hi&quot;);
// 첫 번째 인자 index,
//배열의 변경을 시작할 인덱스입니다. 배열의 길이보다 큰 값이라면 실제 시작 인덱스는 배열의 길이로 설정됩니다. 음수인 경우 배열의 끝에서부터 요소를 세어나갑니다(원점 -1, 즉 -n이면 요소 끝의 n번째 요소를 가리키며 array.length - n번째 인덱스와 같음). 값의 절대값이 배열의 길이 보다 큰 경우 0으로 설정됩니다.    
//두 번째 삭제할 것,
//1이면 하나 제거 2개면 2개 제거 0개 면 제거 안 함
//세 번째 추가할 것
//추가 할 값</code></pre>
<ol>
<li>React memo</li>
</ol>
<p>React.memo는 고차 컴포넌트(Higher Order Component)입니다.
컴포넌트가 동일한 props로 동일한 결과를 렌더링해낸다면, React.memo를 호출하고 결과를 메모이징(Memoizing)하도록 래핑하여 경우에 따라 성능 향상을 누릴 수 있습니다. 즉, React는 컴포넌트를 렌더링하지 않고 마지막으로 렌더링된 결과를 재사용합니다.</p>
</li>
</ol>
<p>React.memo는 props 변화에만 영향을 줍니다. React.memo로 감싸진 함수 컴포넌트 구현에 useState, useReducer 또는 useContext 훅을 사용한다면, 여전히 state나 context가 변할 때 다시 렌더링됩니다.
이 메서드는 오직 성능 최적화를 위하여 사용됩니다. 렌더링을 “방지”하기 위하여 사용하지 마세요. 버그를 만들 수 있습니다.</p>
<p>DraggableCard에게 동일한 index와 동일한 todo prop을 받으면 리랜더링을 하지 않도록 하기 위함이다.</p>
<pre><code>function MyComponent(props) {
/* props를 사용하여 렌더링 */
}

export default React.memo(MyComponent, areEqual);</code></pre><p><a href="https://ko.reactjs.org/docs/react-api.html#reactmemo">https://ko.reactjs.org/docs/react-api.html#reactmemo</a></p>
<ol start="2">
<li><p>숙련주차 마무리</p>
<p> 상당히 힘든 주차였다. 프론트가 이렇게 할게 많다니 예외처리 등 하면 끝이 없다. 시간이 많이 주어졌다면 기능들을 좀 더 명확하고 정확하게 구현할 수 있을거 같은데 시간이 좀 부족했다. 이번 주차에서 한 가지 얻은게 있는데 날림 코딩을 지양해야 한다는 것이다. 여태것 코드를 짤 때 날림 코드 즉 생각나는데로 코드를 쓰고 구현되면 넘어가고 최종 마무리 때 그걸 다시 클린하게 짰었는데 코드 양이 많아지다보니 마지막에 클린코드를 하지 못했다. 내가 왜 이 코드를 썻는지 이해가 잘 되지 않았다. 돌아다니는 짤로 &#39;처음 이 코드를 구현할 때 신과 나만이 안다. 하지만 이제는 신만 안다.&#39; 이게 완전히 나의 이야기 인 것 같았다. </p>
<p> 앞으론 날림코드를 작성하되 기능구현이 끝나면 그때그때 바로 클론코드를 짜야겠다. </p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[
기술 표준의 중요성 & 자유로운 소프트웨어, 오픈소스]]></title>
            <link>https://velog.io/@natural-nine/11</link>
            <guid>https://velog.io/@natural-nine/11</guid>
            <pubDate>Mon, 06 Jun 2022 14:30:12 GMT</pubDate>
            <description><![CDATA[<ul>
<li>1일 1로그 100일 완성 IT지식 - Understanding the Digital Word</li>
</ul>
<hr>
<ul>
<li><p>기술 표준의 중요성</p>
<p>표준이란 어떤 기술적 산물이 어떻게 만들어지고 어떻게 작동하도록 되어 있는지 명확하고 상세하게 기술한 것.</p>
<p>ex) 전기 콘센트 220v, HDMI, USB 등등</p>
<p>소프트웨어에서도 많은 표준 존재</p>
<p>ex) 아스키코드, 유니코드, 프로그래밍 언어 등등</p>
</li>
</ul>
<hr>
<ul>
<li><p>자유로은 소프트웨어, 오픈소스</p>
<p>프로그래머가 작성하는 코드는 소스코드(Source Code)</p>
<p>소스코드를 프로세서에서 실행하기 적합한 형태로 컴파일한 결과는 오브젝트 코드(Object Code)</p>
<p>연구와 개선 활동을 위해 모두 소스코드를 자유롭게 사용할 수 있는 오픈소스(Open Source)</p>
<p>과거에는 대부분의 소스코드는 개발 회사의 독점 이 때문에 수정 및 개선 불가</p>
<p>리처드 스톨만 GNU 프로젝트 시작, 자유로운 소프트웨어를 만들어 내는 것</p>
<p>대부분의 오픈소스 제공 파이어폭스, 크롬 브라우저, 안드로이드 운영체제</p>
<p>프로그래밍 언어와 지원 도구는 거의 항상 오픈소스로 만들어 짐 google-go apple-swift 등</p>
<p>리눅스 운영체제 오픈소스 프로젝트 자신만의 용도로 사용 가능 하지만 배포할 시 소스코드를 공개해야함</p>
<p>오픈소스로 인한 수익은 기술 지원, 기타 서비스 이용에 요금을 청구</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[06-06-2022 TIL(Firebase Authentication)]]></title>
            <link>https://velog.io/@natural-nine/06-06-2022-TILFirebase-Authentication</link>
            <guid>https://velog.io/@natural-nine/06-06-2022-TILFirebase-Authentication</guid>
            <pubDate>Mon, 06 Jun 2022 14:02:58 GMT</pubDate>
            <description><![CDATA[<ol start="0">
<li><p>React Magazine 개인과제</p>
<p> 개인과제를 시작했다. 회원가입부터 로그인, 게시글 작성과 사진 업로드 또 거기다가 댓글 창까지.. 구현해야할게 굉장히 많다. 저번주에 비하면 난이도가 상당히 올라갔다. 
 회원가입은 firebase에 auth라는 기능을 쓰면 굉장히 쉽게 구현이 됐다. 
 createUserWithEmailAndPassword(id, password)를 보내고 생성되고</p>
<p>  signInWithEmailAndPassword(id, passoword)를 보내면 데이터를 받아온다.</p>
<p>  비동기 통신이기 때문에 async와 await는 필수
  다만 처음에 아이디와 비밀번호를 만들 때 id, password만 두 가지만 보내야 하는데
  나는 nick까지 총 3가지를 보내서  createUserWithEmailAndPassword(id, nick, password) signInWithEmailAndPassword(id, passoword)를 하는데 오류가 났다. 거의 한 3-4시간은 삽질 한 듯 id, passoword 두 가지만 보내거나, id, passoword, nick 순서에 맞게 보내야 한다! 자꾸 signInWithEmailAndPassword(id, passoword) 보내는데 wrong password라고 오류가 났다. 저장된 password는 nick이 었다... 괜한 시간 개삽질</p>
<p>  img upload 또한 쉽게 구현할 수 있었는데 storage를 만든 다음 작업하면 끝
  하지만 사진을 업로드하고 바로 버튼을 누려면 업로드가 되지 않는다. 1-2초간 기다린 다음 버튼을 눌러야 그제서야 url 정보가 업로드 됨.. 이것도 한번 고쳐봐야겠다.</p>
<p>  내일까지 과제를 끝내야겠다. 어서</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[05-30 ~ 06-04 WIL(Weekly I Learned)]]></title>
            <link>https://velog.io/@natural-nine/05-30-06-04-WILWeekly-I-Learned</link>
            <guid>https://velog.io/@natural-nine/05-30-06-04-WILWeekly-I-Learned</guid>
            <pubDate>Sun, 05 Jun 2022 13:12:41 GMT</pubDate>
            <description><![CDATA[<ol start="0">
<li><p>라이프사이클 클래스형과 함수형</p>
<p>컴포넌트의 라이프 사이클(컴포넌트의 생명주기)
컴포넌트가 렌더링 준비하는 순간부터 페이지에서 사라질 때까지 라이프 사이클</p>
<p><img src="https://velog.velcdn.com/images/natural-nine/post/5bd5fa25-7f07-4f23-ab51-6e6aea0b1565/image.jpeg" alt=""></p>
<p>컴포넌트는 생성되고 수정 및 업데이트되고 제거 됨</p>
<p>constructor는 컴포넌트를 불러오는 단계</p>
<p>수정은 데이터가 바뀌거나 부모컴포넌트가 렌더링할 때(props,state가 바뀔 때)</p>
<p>제거는 페이지를 이동하거나 삭제버튼 등으로 컴포넌트가 화면에서 사라지는 단계</p>
</li>
</ol>
<hr>
<p> 라이프사이클 함수는 클래스형 컴포넌트에서만 사용이 가능하다. 함수형 컴포넌트에서는 hook으로 대체 가능!</p>
<hr>
<ol>
<li><p>React Hook</p>
<p> React Hook은 함수형 컴포넌트에서 라이프사이클 메서드를 사용하기 위해 만들어졌다.</p>
<p> 1) useState()</p>
<p> 가장 기본적인 hook이며 상태관리할 때에 사용한다</p>
<pre><code> const [count, setCount] = useState(0);</code></pre><p> 인자로 넘겨주는 것은 state의 초기 값 여기서는 0 
 count 0이 되고
 setCount로 값을 수정하고
 다시 수정된 값이 count에 들어간다.</p>
</li>
</ol>
<p> 2) useEffect()</p>
<p> 라이프사이클에서 componentDidMount, componentDidUpdate, componentWillUnmount가 합쳐진 것.</p>
<pre><code>useEffect(()=&gt;{},[])</code></pre><p> hook을 이용해 사이드 이펙트를 수행할 수 있는데 데이터 가져오기와 구독과 수동으로 DOM을 조작할 수 있다.</p>
<p> 3) useRef()</p>
<p> useRef는 .current 프로퍼티로 전달된 인자(initialValue)로 초기화된 변경 가능한 ref 객체를 반환한다. 반환된 객체는 컴포넌트의 전 생애주기를 통해 유지된다.</p>
<p>  4) useContext()</p>
<p> context 객체(React.createContext에서 반환된 값)을 받아 그 context의 현재 값을 반환한다. context의 현재 값은 트리 안에서 이 Hook을 호출하는 컴포넌트에 가장 가까이에 있는 &lt;MyContext.Provider&gt;의 value prop에 의해 결정됨</p>
<p>  5) useReduser</p>
<p>   useSate의 대체 함수 (state, action) =&gt; newState의 형태로 reducer를 받고 dispatch 메서드와 짝의 형태로 현재 state를 반환. 다수의 하윗값을 포함하는 복잡한 정적 로직을 만드는경우나 다음 state가 이전 state에 의존적인 경우에 보통 useState보다 useReducer를 더 선호.</p>
<hr>
<ol start="2">
<li><p>Firebase Authentication</p>
<p> firebase authentication 방식에 회원가입에 대해서 공부를 해봤다.
 비교적 굉장히 간단했다.
 getAuth를 가져오고 createUserWithEmailAndPassword를 통해
 가져온 auth와 회원 이메일 아이디 비밀번호를 넘겨주면 된다. 단 비동기 통신이기때문에 promise ascyn와 await를 사용해아한다.</p>
</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>