<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>s.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 03 Oct 2024 21:29:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>s.log</title>
            <url>https://velog.velcdn.com/images/_ddu2ni/profile/2464e22d-b208-4d2a-882f-ce675f8282a0/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. s.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/_ddu2ni" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[React] GSAP - TextPlugin]]></title>
            <link>https://velog.io/@_ddu2ni/React-GSAP-TextPlugin</link>
            <guid>https://velog.io/@_ddu2ni/React-GSAP-TextPlugin</guid>
            <pubDate>Thu, 03 Oct 2024 21:29:37 GMT</pubDate>
            <description><![CDATA[<p>내가 원하는 단어로 끊어서 화면에 띄우려면 </p>
<p><strong>gsap</strong>에서는 <strong><code>TextPlugin</code></strong>이 존재한다!</p>
<br/>

<p>플러그인 사용법은 </p>
<blockquote>
<h4 id="gsapregisterplugin-원하는-플러그인-">gsap.registerPlugin( 원하는 플러그인 );</h4>
</blockquote>
<p>이렇게 상단에 등록해주면 된다!</p>
<br/>

<p>이외에도 다른 플러그인 종류는 </p>
<blockquote>
<ul>
<li><strong>ScrollTrigger</strong> : 스크롤 이벤트 </li>
</ul>
</blockquote>
<ul>
<li><strong>MotionPathPlugin</strong> : 경로에 따라 움직이는 애니메이션  - <code>내가 하고싶은 공 path</code> </li>
<li><strong>Draggable</strong> : 요소 드래그</li>
<li><strong>CSSRulePlugin</strong> :   CSS의 @keyframes나 :before, :after  접근 가능</li>
<li><strong>Flip Plugin</strong> : UI 요소의 위치나 상태가 변할 때 부드러운 전환 가능</li>
<li><strong>DrawSVGPlugin</strong> : SVG의 경로를 그리듯한 애니메이션 적용 가능</li>
</ul>
<p>이런것들이 있는데, 이건 차차 배워가도록 해보자! </p>
<p>일단 TextPlugin부터 사용해보자 !</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] GSAP - 기초문법]]></title>
            <link>https://velog.io/@_ddu2ni/React-GSAP-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@_ddu2ni/React-GSAP-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 02 Oct 2024 21:26:45 GMT</pubDate>
            <description><![CDATA[<p><strong><code>GSAP</code></strong>은 되게 <code>인터랙티브한 라이브러리</code>다 </p>
<p>공식 홈페이지 들어간 순간부터 화려한 애니메이션이 내 마음에 들었다..!! </p>
<p>그래서 이번 내 포트폴리오로 만들 웹사이트도 GSAP을 거의 중점으로 사용해보려고 한다.</p>
<p>그러기 위해선 일단 러닝커브가 좀 필요한 라이브러리 같아서 연습 겸 사용법을 익혀보려고 한다 !! 👏🏻</p>
<hr>
<p>처음에 아무것도 모르고 서치했을 땐,</p>
<p>그냥 gsap을 사용한 react에서  <code>useEffect</code>를 사용한 방법이 나왔어서 이렇게 고대로 연습해봤었다.</p>
<br/>

<ul>
<li><p>단일 애니메이션을 쓸거면 바로 <code>gsap.to</code>로 시작해도되지만,</p>
</li>
<li><p>여러 애니메이션을 쓸 상황이면 useEffect 안에 여러 애니메이션을 <code>변수에 담아서</code> 써주면 된다 !</p>
</li>
</ul>
<br/>



<blockquote>
<h3 id="gsap--useref-사용하기">gsap + useRef 사용하기</h3>
</blockquote>
<pre><code class="language-js">import { useEffect, useRef } from &#39;react&#39;;
import &#39;../styles/main.scss&#39;;
import gsap from &#39;gsap&#39;;

const Main = () =&gt; {
  const container = useRef();
  const circle = useRef();

  useEffect(() =&gt; {
    let tot = gsap.context(() =&gt; {
      gsap.to(&#39;.box&#39;, { rotate: 360 });
      gsap.to(circle.current, { rotation: 360 });
    }, app);

    return () =&gt; tot.revert(); //정리
  });

  return (
    &lt;div ref={container} className=&#39;container&#39;&gt;
      &lt;div className=&#39;box&#39;&gt;selector&lt;/div&gt;
      &lt;div className=&#39;circle&#39; ref={circle}&gt;
        circle
      &lt;/div&gt;
    &lt;/div&gt;
  );
};
export default Main;
</code></pre>
<br/>

<p>그런데 이 방법 말고 react-gsap에선 react에서 좀 더 편리하게 쓰기 위해 내장객체 <code>Timeline</code> / <code>Tween</code> 를 이용해서 간결한 코드로 작성할 수 있게 해준다고 한다!!</p>
<br/>

<ul>
<li><p>단일 애니메이션을 쓸거면<code>Tween</code>만으로 충분하지만,</p>
</li>
<li><p>여러 애니메이션을 쓸 상황이면 <code>Timeline</code> 안에 <code>Tween</code>을 넣어서 순서대로 또는 동시 실행, 지연 시간 추가 등 다양한 제어를 해줄 수 있다!</p>
</li>
</ul>
<br/>

<blockquote>
<h3 id="react-gsap--timeline-사용하기">react-gsap + Timeline 사용하기</h3>
</blockquote>
<pre><code class="language-JS">import &#39;../styles/main.scss&#39;;
import { Timeline, Tween } from &#39;react-gsap&#39;;

const Main = () =&gt; {
  return (
    &lt;div className=&#39;app&#39;&gt;
      &lt;Timeline target={&lt;div className=&#39;box&#39;&gt;box&lt;/div&gt;}&gt;
        &lt;Tween from={{ opacity: 0 }} to={{ opacity: 1 }} duration={2} /&gt;
        &lt;Tween to={{ x: &#39;200px&#39; }} /&gt;
      &lt;/Timeline&gt;
    &lt;/div&gt;
  );
};
export default Main;
</code></pre>
<p>방금 위에껀 순차실행이었지만, </p>
<p>동시 실행은 <code>position={0}</code>을 사용해서 동시에 시작할 수 있게 해준다</p>
<Timeline>
  <Tween from={{ opacity: 0 }} to={{ opacity: 1 }} duration={1} />
  <Tween to={{ x: '200px' }} position={0} />
</Timeline>


<hr>
<br/>


<h4 id="😅-그래서-그냥-둘-중-아무거나-쓰면-되는거-아니야">😅 그래서 그냥 둘 중 아무거나 쓰면 되는거 아니야..?</h4>
<p>라고 생각한 나는 열심히 서치를 해본 결과 </p>
<br/>

<h3 id="✨-gsap-관련-정리">✨ GSAP 관련 정리</h3>
<blockquote>
<h3 id="--timeline">- Timeline</h3>
</blockquote>
<ul>
<li>간단하게 + 순서대로 (순차적일 때) 적합</li>
<li>여러 애니메이션 실행 시킬 수 있음 </li>
<li>코드 간결</li>
</ul>
<br/>


<blockquote>
<h3 id="--gsap--useref">- gsap + useRef</h3>
</blockquote>
<ul>
<li>특정 시점에 트리거 하고 싶을 때 적합</li>
</ul>
<h4 id="└-🔎--트리거가-뭐야">└&gt; 🔎  트리거가 뭐야?</h4>
<p>: 어떤 행동이나 이벤트를 시작하는 것 </p>
<ul>
<li>(조건이 충족 됐을 때 무엇인가 실행되는 상황)</li>
</ul>
<br/>


<h4 id="└-🔎--이건-timeline도-할-수-있지-않아">└&gt; 🔎  이건 Timeline도 할 수 있지 않아?</h4>
<p>할 수는 있지만, 더 직접적으로 그 특정 시점의 상태에 접근하고 싶을 땐! useRef로 써준다!</p>
<p>특정 시점(ex: 페이지가 로드되거나, 이 버튼을 클릭하면 좌우로 움직이게 해주는 것 )에 정확하게 제어하</p>
<p><br/><br/></p>
<hr>
<p>**[GSAP 사용법] **  - <a href="https://velog.io/@dolfin/GSAP-%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90%EC%84%9C-GSAP-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0">참고 1</a> / <a href="https://wazacs.tistory.com/38">참고 2</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 - 4주차 회고록]]></title>
            <link>https://velog.io/@_ddu2ni/%EC%9C%A0%EB%8D%B0%EB%AF%B8x%EC%8A%A4%EB%82%98%EC%9D%B4%ED%8D%BC%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%BA%A0%ED%94%84-React-2%EA%B8%B0-4%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
            <guid>https://velog.io/@_ddu2ni/%EC%9C%A0%EB%8D%B0%EB%AF%B8x%EC%8A%A4%EB%82%98%EC%9D%B4%ED%8D%BC%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%BA%A0%ED%94%84-React-2%EA%B8%B0-4%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</guid>
            <pubDate>Sat, 28 Sep 2024 19:04:17 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/343a8318-6f8a-4491-9dcf-859697739c77/image.png" alt=""></p>
<br/>

<p>한달 반이 흘러가서 벌써 4주차 마지막 주가 됐다! </p>
<p>이번주는 엄청 바쁜 한 주 였는데, 왜냐하면<del>~</del></p>
<p>우리 팀이 <strong>발표 팀</strong> 안에 들었기 때문이다!!!😆✨🥳🎈🎉</p>
<br/>

<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/439930ba-dd3a-4882-bcf9-1a5acbc5a52e/image.png" alt=""></p>
<br/>

<p>그래서 한 주동안 정말 바쁘게 발표준비도 하고, 수정사항 거쳐서 배포도 하고 의미 있는 한 주를 보내며 마무리 지을 수 있었다!</p>
<p>대망의 <strong>최종 성과발표회</strong> 날!!!</p>
<p>날씨도 완전 가을날씨처럼 좋고 럭키비키잖햐~~🌥️😆💫</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/_ddu2ni/post/030e0c24-c903-4e6b-a215-6443b6c0eb27/image.jpg" width="300"/></th>
<th><img src="https://velog.velcdn.com/images/_ddu2ni/post/b711b4fc-a1a2-4861-b2cf-95c2d6b9a891/image.jpg" width="300"/></th>
<th><img src="https://velog.velcdn.com/images/_ddu2ni/post/4147c079-0245-446f-9926-7a652298be2f/image.jpg" width="300"/></th>
</tr>
</thead>
</table>
<p>정해진 발표팀 좌석에 앉아서 리허설도 하고, 밥도 먹고 돌아와서 발표회를 시작했다</p>
<p>우리팀은 1등으로 발표하고, 그 뒤로 나머지 팀들도 발표했는데 다들 진짜 영혼을 갈아넣은게 보였다,,,</p>
<p>다른 팀들도 진짜 너무 잘했,,,,같이 고생한 2기 분들께 박수 👏🏻</p>
<br/>

<p>대망의 <strong>시상식</strong>!!! </p>
<p>두구두구두구<del>~</del></p>
<br/>


<p>몇 십명이 이 프로젝트 캠프에 참여한 걸로 알고있는데, 그 중에 <strong>3명의 우수수료생</strong>을 뽑는다고 OT때 들었다</p>
<p>근데 진짜 상상도 못했는데, <strong>내가 그 안에 들어서</strong> 팀원들과 함께 너무 놀랬다,,,!!!!!!🎈🎉👧🏻👏🏻💫😆✨</p>
<br/>

<p>*<em>열심히 성실하게 참여했는데 알아봐주신것 같아서 너무 기분이 좋았다  *</em></p>
  <img src="https://velog.velcdn.com/images/_ddu2ni/post/97575ff7-697b-490c-b350-5252b3d3dfe5/image.jpg" alt="image3" width="100%" />


<p>이 캠프를 알게되서 얻어가는 것도 너무 많고,</p>
<br/>

<p>특히나 특히 우리 KT멘토님👨🏻,, 팀원들끼리 얘기하면서 진짜 천사 아니냐며 </p>
<p>우리 멘토님 덕분에 KT이미지 다시 보인다고 ㅋㅋㅋㅋㅋㅋㅋㅋ</p>
<br/>

<p>진짜 좋은 멘토님과 함께 착하고 좋았던 팀원들과</p>
<p><strong>재밌게 한달간 프로젝트를 끝낼 수 있어서 값지고 행복한 시간이었던 것 같다!</strong></p>
<br/>

<p>누군가 이 프로젝트를 생각한다면 무조건 <strong>추천</strong>! </p>
<p>직무교육 + 기업연계 프로젝트까지 안하지 않을 이유가 전혀 없다<del>~</del>👍🏻</p>
<p><br/><br/></p>
<hr>
<br/>

<h3 id="📝-마지막-회고록">📝 마지막 회고록</h3>
<blockquote>
<ul>
<li><strong>Kepp (유지)</strong>
: 성공적으로 수행 / 긍정적인 경험 / 만족하는 부분 / 앞으로 유지할 부분</li>
</ul>
</blockquote>
<ul>
<li><strong>우리 팀이 발표 팀안에 든거 !!</strong></li>
<li><strong>배포 성공</strong>한거</li>
</ul>
<h4 id="└">└&gt;</h4>
<p>나빼고 다 대학생이라 학업이랑 병행하느라
다른 팀들보다는 시간 쏟아붓는 것도 적고 그래서 그 부분이 힘들다면 힘들었지만, </p>
<p>그래도 잘 마무리 지을 수 있어서 다행이었다 😆</p>
<hr>
<blockquote>
<ul>
<li><strong>Problem (문제)</strong></li>
</ul>
</blockquote>
<ul>
<li>반응형까지 고려하기엔 프로젝트 시간이 부족했기 때문에</li>
</ul>
<p>멘토님과 프로젝트 시작 전부터 이 부분에 대해선 하지말자고 얘기를 하고 시작했었다.</p>
<p>그래서 그 부분을 놓친게 조금 아쉬웠다!</p>
<hr>
<blockquote>
<ul>
<li><strong>Try (시도)</strong>
: 다음 스프린트에서 시도해 볼 새로운 아이디어나 개선 사항</li>
</ul>
</blockquote>
<ul>
<li>반응형 고려</li>
<li>클린코드를 위한 리팩토링</li>
</ul>
<p><br/><br/><br/>
_
——————————————————————————
본 후기는 본 후기는 [유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 과정(B-log) 리뷰로 작성 되었습니다._</p>
<pre><code>코드를 입력하세요</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] ... 넘치는 텍스트 표시하는 방법]]></title>
            <link>https://velog.io/@_ddu2ni/CSS-...-%EB%84%98%EC%B9%98%EB%8A%94-%ED%85%8D%EC%8A%A4%ED%8A%B8-%ED%91%9C%EC%8B%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@_ddu2ni/CSS-...-%EB%84%98%EC%B9%98%EB%8A%94-%ED%85%8D%EC%8A%A4%ED%8A%B8-%ED%91%9C%EC%8B%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 23 Sep 2024 14:16:00 GMT</pubDate>
            <description><![CDATA[<p><code>KT야구구단웹사이트</code> 프로젝트 진행하면서 배웠던 CSS 속성이 있다.</p>
<p>간혹 웹사이트나 인스타 보다보면 <code>...</code> 텍스트가 너무 길어서 말 끝이 <code>...</code>로 대체된 걸 볼 수 있을 것이다. </p>
<blockquote>
<h4 id="참고--ktwiz">참고 : <a href="https://www.ktwiz.co.kr/">KTWIZ</a></h4>
</blockquote>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/3f7e0afa-c5f9-4586-b6d5-609a92ea5d26/image.png" alt=""></p>
<br/>

<p>2가지 방법이 있는데 </p>
<br/>

<blockquote>
<h3 id="🤔-첫번째-방법">🤔 첫번째 방법</h3>
<p>: 한 줄 텍스트 생략</p>
</blockquote>
<p>1) <code>너비</code> 설정
2) <code>white-space: nowrap</code> = (공백 줄바꿈 x) <strong>한줄로 처리</strong>
3) <code>overflow: hidden</code> = 너비에서 벗어나는건 히든처리
4) <code>text-overflow: ellipsis</code> = 잘려지는 부분에 말 줄임표시</p>
<br/>

<blockquote>
<h3 id="😆-두번째-방법">😆 두번째 방법</h3>
<p>: 다중 줄 텍스트 생략</p>
</blockquote>
<p>1) <code>너비</code> 설정
2) <code>white-space: normal</code> = 여러 줄 텍스트 표시
3) <code>overflow: hidden</code> = 너비에서 벗어나는건 히든처리
4) <code>display: -webkit-box</code> = -webkit-box는 요소를 박스 컨테이너로 설정하여 자식 요소들이 플렉스박스처럼 배치되도록 만듦
5) <code>-webkit-box-orient: vertical</code> 박스의 배치 방향
<strong>텍스트가 세로로 여러 줄에 걸쳐 표시되도록 설정</strong>
6) <code>-webkit-line-clamp:2</code> = 표시하고싶은 줄 개수</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 - 3주차 회고록]]></title>
            <link>https://velog.io/@_ddu2ni/%EC%9C%A0%EB%8D%B0%EB%AF%B8x%EC%8A%A4%EB%82%98%EC%9D%B4%ED%8D%BC%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%BA%A0%ED%94%84-React-2%EA%B8%B0-3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
            <guid>https://velog.io/@_ddu2ni/%EC%9C%A0%EB%8D%B0%EB%AF%B8x%EC%8A%A4%EB%82%98%EC%9D%B4%ED%8D%BC%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%BA%A0%ED%94%84-React-2%EA%B8%B0-3%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</guid>
            <pubDate>Sun, 22 Sep 2024 12:45:00 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/53002aec-b2f7-4302-9aa1-bb2544dc9b4a/image.png" alt=""></p>
<blockquote>
<p><strong>프로젝트 기간</strong> : 2024.09.02 ~ 2024.09.27
*<em>프로젝트 주제 *</em>: React로 KTwiz 정보제공 페이지 만들기</p>
</blockquote>
<hr>
<br/>

<p>이번주는 직접 kt송파 사옥에 가서 멘토님과 함께 중간발표를 하는 대면 미팅이 잡혀있었다,,!!</p>
<p>팀원들과 열심히 준비하고 기회가 된다면 나중에 다시 만나기로 했다(?)ㅋㅋㅋㅋㅋ</p>
<p>그만큼 그동안 열심히 준비해서 취업하자 이 말,,,!!</p>
<br/>

<p>벌써 마지막 차주가 다가오다니 신기하다</p>
<p>시간이 넘 금방가버린 것 같은 이 기분,,</p>
<p>요새 오프미팅 나가면 다들 마지막까지 마무리 잘 하자고 외치고 있다 😆</p>
<br/>

<hr>
<h3 id="🔥-todo">🔥 TODO</h3>
<blockquote>
<h4 id="🫨-정규리그">🫨 정규리그</h4>
</blockquote>
<p>이번주는 정규리그 페이지에 메달렸다,,, 양이 꽤 많았기때문에, 달렸어야하는데 추석도 껴있어서 약간 마음이 불편했다...</p>
<p>테이블과 차트, 막대 그래프를 사용해야해서 해당 라이브러리는 처음 써보는 거라 학습도 좀 필요했는데, </p>
<p>막상 사용해보니까 차트,막대 그래프는 러닝커브가 낮은편이었다</p>
<p>어떤 라이브러리를 고를지 고민해서 그렇지...! </p>
<br/>

<p><code>차트, 막대</code> -&gt; <code>recharts</code> 라이브러리</p>
<p><code>테이블</code> -&gt; <code>tanstack-table</code> 라이브러리로 결정해서 사용했다!!</p>
<br/>

<p>자세한 내용은 따로 게시글에 쓸 예정이다</p>
<br/>



<hr>
<h3 id="📝-회고록">📝 회고록</h3>
<blockquote>
<ul>
<li><strong>Kepp (유지)</strong>
: 성공적으로 수행 / 긍정적인 경험 / 만족하는 부분 / 앞으로 유지할 부분</li>
</ul>
</blockquote>
<ul>
<li><p>나를 제외하곤 다 학교랑 병행하고 있는 대학생들이여서 지치지 않고 열심히 계속 해주는 우리 팀원들 모두 박수,,대단해👏🏻</p>
</li>
<li><p>오프라인 미팅할 때 다같이 으쌰으쌰하고, 막히는 부분있으면 같이 문제 해결해줘서 너무 좋다! 팀원들 최고 </p>
</li>
<li><p>사진은 추억하기위해 중간발표 때 찍은 사진! (출입증정도는 괜찮을 것 같다🤔)</p>
</li>
</ul>
<img src="https://velog.velcdn.com/images/_ddu2ni/post/b8064d30-3ea2-4c49-b6fb-7ab4f7a0a661/image.png" width="35%" height="auto">




<hr>
<blockquote>
<ul>
<li><strong>Problem (문제)</strong></li>
</ul>
</blockquote>
<p>진짜 사소한건데 너무 시간을 많이 잡아먹었던,,,,</p>
<p>데이터 패치 무한렌더링의 늪에 빠져버린,,,,</p>
<p><strong>이번주에 작업했던 내용들이 주 프로젝트 key라, 프로젝트 끝나고 더 자세하게 쓸 예정이다!!!</strong></p>
<p>기록하고 싶은 말 엄청 많다,,,!!!!</p>
<hr>
<blockquote>
<ul>
<li><strong>Try (시도)</strong>
: 다음 스프린트에서 시도해 볼 새로운 아이디어나 개선 사항</li>
</ul>
</blockquote>
<ul>
<li>멘토님이 말씀해주신 피드백 사항 적용하기</li>
<li>배포 try!!!</li>
</ul>
<p><br/><br/><br/>
_
——————————————————————————
본 후기는 본 후기는 [유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 과정(B-log) 리뷰로 작성 되었습니다._</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[🥎 WIZonFire 프로젝트] - 야구 구단 웹사이트 : 변경사항]]></title>
            <link>https://velog.io/@_ddu2ni/WIZonFire-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%95%BC%EA%B5%AC-%EA%B5%AC%EB%8B%A8-%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%B3%80%EA%B2%BD%EC%82%AC%ED%95%AD</link>
            <guid>https://velog.io/@_ddu2ni/WIZonFire-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%95%BC%EA%B5%AC-%EA%B5%AC%EB%8B%A8-%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%B3%80%EA%B2%BD%EC%82%AC%ED%95%AD</guid>
            <pubDate>Sat, 21 Sep 2024 11:18:16 GMT</pubDate>
            <description><![CDATA[<h3 id="✅-프로젝트-아키텍처-구성">✅&nbsp; 프로젝트 아키텍처 구성</h3>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/7811a20d-77ca-4205-bf16-b8e078d038b0/image.png" alt=""></p>
<h4 id="🤔❓-이유">🤔❓ 이유</h4>
<p>폴더구조는 정해진 규칙이 없고 개인의 취향을 따라가기 때문에 팀원들간에 경험했던 바도 다르므로 처음에 정해놓고 시작해야한다. 기존에 많이 잘 알려진 폴더구조로는  <code>FSD(Feature Sliced Design)</code> 가 있지만, 우리 조는 프로젝트를 처음 해보는 친구들도 있었기에 강사님께서 알려주신 방법대로 기본 폴더 구조로 시작해보려고 한다.  </p>
<blockquote>
<h4 id="참고--fsd--기능-분할-설계-">참고 : <a href="https://developers.hyundaimotorgroup.com/blog/399">FSD [ 기능 분할 설계 ] </a></h4>
</blockquote>
<p>기능별로 컴포넌트를 나눈 구조로 / 컴포넌트 / 타입 / 상태 관리 / 커스텀 훅 등 역할에 따라 명확히 분리되어 있어 파일을 찾기 쉽고 코드 관리가 효율적이라서 이렇게 선택했습니다.</p>
<p><br/><br/></p>
<hr>
<h3 id="✅랜딩페이지">✅&nbsp;랜딩페이지</h3>
<br/>

<h3 id="1-1">1-1)</h3>
<br/>

<p><strong>변경 전</strong></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/3a657d78-a049-4216-bc3e-a14e1d5a4168/image.png" alt=""></p>
<p><strong>변경 후</strong></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/4e360642-c68b-4297-96ee-29b9b5eb59df/image.png" alt=""></p>
<br/>

<h4 id="🤔❓-이유-1">🤔❓ 이유</h4>
<ul>
<li><p>** 브랜드 강조: ** 
로고를 중앙에 배치함으로써 브랜드 정체성 강화 ↑ / 시각적으로 중심을 잡으므로 안정감 부여</p>
</li>
<li><p>** 사용자 경험 개선: **
메뉴 아래에 하단선을 추가하여 네비게이션 바가 더 명확하게 구분되고 일관된 하단선이 있어서, 인터페이스가 더 정돈 된 느낌이 있음 </p>
</li>
<li><p>** 디자인의 통일성: **
로로 양 옆으로 메뉴 항목들이 있어서 균형잡힌 레이아웃으로 깔끔함과 정리된 느낌을 줄 수 있음</p>
</li>
</ul>
<br/>

<h3 id="1-2">1-2)</h3>
<br/>

<p><strong>변경 전</strong></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/3a657d78-a049-4216-bc3e-a14e1d5a4168/image.png" alt=""></p>
<p><strong>변경 후</strong></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/4e360642-c68b-4297-96ee-29b9b5eb59df/image.png" alt=""></p>
<br/>

<h4 id="🤔❓-이유-2">🤔❓ 이유</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[테이블 라이브러리 - 여러 키값 활용하기]]></title>
            <link>https://velog.io/@_ddu2ni/%ED%85%8C%EC%9D%B4%EB%B8%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%97%AC%EB%9F%AC-%ED%82%A4%EA%B0%92-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@_ddu2ni/%ED%85%8C%EC%9D%B4%EB%B8%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%97%AC%EB%9F%AC-%ED%82%A4%EA%B0%92-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 17 Sep 2024 21:50:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/d85dcdee-a63f-42af-8605-a54a9779fc86/image.png" alt=""></p>
<p>현재 나는 데이터가 모두 나열된 테이블 형식으로 출력되고 있다</p>
<p>근데 내가 원하는건 이렇게 팀 간 승패를 행과 열로 나눠서 표시하고 싶은데,,,!</p>
<p>출처 : [ktwiz] <a href="https://www.ktwiz.co.kr/game/regular/ranking/team">https://www.ktwiz.co.kr/game/regular/ranking/team</a></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/1c9c1e90-f599-4548-b401-192dca7567ad/image.png" alt=""></p>
<br/>

<p>나는 기존에 테이블 라이브러리를 쓸 때 이렇게 여러 데이터를 이용해서 하질 않아서 낯설었다</p>
<br/>

<p>나는 각 팀별로 상대 팀에 대한 승-패-무 데이터를 행렬로 배치하고,</p>
<p>상단에 각 상대 팀을 열로 배치하고 싶다</p>
<br/>

<p>그러려면 어떻게 해야하는가?</p>
<p>기존에 있던 타입정의에 ㅇㅇㅇ도 있고 ,   [key: string]에 해당하는 key도 있는데</p>
<p>그럼 기존에 있던 타입정의에 +  <code>[key: string]: string;</code>만 추가하면 안되나?</p>
<p>결론은,</p>
<p>안된다! 그 이유는 이렇게 되면 기존 타입정의에는 여러 타입이 정의 되어 있을텐데</p>
<p><code>[key: string]: string;</code>가 들어오면 모든 문자열이 string이 되어야해서 <code>타입충돌</code>이 일어난다 😣</p>
<br/>

<p>그러니까 따로 타입을 새로 정의해주도록 하자</p>
<pre><code class="language-ts">type TTeamMatchupTableType = {
  ㅇㅇㅇ: string;
  [key: string]: string;  // ㅁㅁㅁ = key, 승-패-무 = 값
};</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[🤔 NaN이 뭘까?]]></title>
            <link>https://velog.io/@_ddu2ni/NaN%EC%9D%B4-%EB%AD%98%EA%B9%8C</link>
            <guid>https://velog.io/@_ddu2ni/NaN%EC%9D%B4-%EB%AD%98%EA%B9%8C</guid>
            <pubDate>Mon, 16 Sep 2024 19:19:54 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/81fbeb00-4524-468e-8192-eb3784f6454f/image.png" alt=""></p>
<p>Javascript에서 숫자 연산을 시도할 때, <code>undefined</code> or <code>null</code>이라서 나타난다.</p>
<blockquote>
<p>NaN = Not a Number
: 데이터가 잘못된 상태로 숫자로 변환될 때</p>
</blockquote>
<br/>

<hr>
<h4 id="🫨-구현하고자-하는-것">🫨 구현하고자 하는 것</h4>
<p>index로 내가 원하고자 하는 셀을 찾아서 없으면  &quot;&quot; 이게 했지만, 여기서 문제가 생겼나보다,,</p>
<p>cell.getValue()가 <code>undefined</code> or <code>null</code> or <code>데이터 자체가 비어있어서</code> 발생할 수 있다고 한다 ,,,!!</p>
<br/>


<hr>
<h4 id="😆-구현한-것">😆 구현한 것</h4>
<pre><code class="language-js">&lt;tbody&gt;
    {visitTable.getRowModel().rows.map((row,rowIndex) =&gt; (
      &lt;RowTr key={row.id}&gt;
        {row.getVisibleCells().map((cell,cellIndex) =&gt; (
      &lt;MainStatsCell key={cell.id}&gt;
        {rowIndex === visitTable.getRowModel().rows.length-1 &amp;&amp; cellIndex === 0 
      ? &quot;&quot;: String(cell.getValue())}
      &lt;/MainStatsCell&gt;
          ))}
    &lt;/RowTr&gt;
  ))}
    &lt;/tbody&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[table, chart 라이브러리 사용해보기]]></title>
            <link>https://velog.io/@_ddu2ni/table-chart-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@_ddu2ni/table-chart-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Fri, 13 Sep 2024 12:49:15 GMT</pubDate>
            <description><![CDATA[<p>테이블 + 차트 라이브러리 서치 중인데, </p>
<p><strong>테이블은 react-table</strong>을 선택했고, <strong>차트는: <a href="https://nivo.rocks/">nivo</a></strong>을 택했다.</p>
<p>└&gt; 선택한 이유? <a href="https://front-kuli.tistory.com/249">참고</a></p>
<h3 id="reatc-table-기능">reatc-table 기능</h3>
<p>=&gt; 이제는 <code>tanstack-table</code>이라고 불린다</p>
<p>단순 그냥 보여주는거 말고, 나는 검색과 정렬이 필요했다. 그리고 Headless라서 내가 원하는대로 커스텀이 가능하다. 나는 열과 컬럼의 크기 조절이 됐으면 좋겠다고 생각해서 해당 라이브러리를 선택했다.</p>
<ul>
<li>필터 </li>
<li>정렬 </li>
<li>페이징 </li>
<li>수정 </li>
<li>열 크기 조절 </li>
<li>컬럼 선택 필터</li>
<li>컬럼 위치 조정</li>
<li>컬럼별 검색</li>
</ul>
<blockquote>
<h4 id="1-reac-table-설치">1. reac-table 설치</h4>
</blockquote>
<ul>
<li>이건 현재 react-table 후속버전 : typescript 지원 o</li>
</ul>
<p><code>npm install @tanstack/react-table</code></p>
<ul>
<li>구버전 react-table</li>
</ul>
<p><code>npm add react-table @types/react-table</code></p>
<blockquote>
<h4 id="2-usetable-훅-작성">2. useTable 훅 작성</h4>
<p>: 공식문서에서 무조건 required라고 되어있음 (columns/data =&gt; memonized되어있어야함,두가지 옵션 필요!)</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/7072ecd0-f750-4ab7-8f67-e69f7f78bd32/image.png" alt=""></p>
<hr>
<blockquote>
<p><code>createColumnHelper</code></p>
</blockquote>
<p>: 타입 안정성 ↑ / 특정 데이터 구조에 맞춰 컬럼 정의 가능</p>
<pre><code class="language-js">const columnHelper = createColumnHelper&lt;TMenu&gt;();

const columns = [
  columnHelper.accessor(&quot;menu&quot;, { header: &quot;메뉴&quot; }),
  columnHelper.accessor(&quot;price&quot;, { header: &quot;가격&quot; })
];</code></pre>
<p>이런식으로 타입을 미리 지정해둬서, 에러 미리 방지!</p>
<p>But, 동적으로 데이터를 매번 API 받아와야하는 상황이라면! <code>createColumnHelper</code>는 정적으로 <code>고정된 데이터</code>에서 유용하다</p>
<hr>
<blockquote>
<h4 id="1-usetable-커스텀-훅-생성">1. useTable 커스텀 훅 생성</h4>
</blockquote>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/deecfff8-95c8-4358-b719-c565e06b02dd/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/c4248c3c-1642-4ba0-9511-c148927b57ce/image.png" alt=""></p>
<p>동적컬럼을 생성할 때 자동으로 생성되게 해주는 것도 있다는데, 나는 안쓰는 컬럼과 그렇게 되면 순서가 data 응답값 순서대로 나열되므로 직접생성하기로 했다.</p>
<ul>
<li>key값은 내장되어있는 id를 써도 됨</li>
</ul>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/e3dbdc0e-1826-4b60-bf68-3af99ac90569/image.png" alt=""></p>
<ul>
<li>아니면 API응답값의 고유 key값을 써도되지만,,, column에서 조합해줘야하니 귀찮아서 나는 내장 id를 쓰겠어,,,
<img src="https://velog.velcdn.com/images/_ddu2ni/post/c213e86d-7a90-4f07-b92b-f08a33b6f9bd/image.png" alt=""></li>
</ul>
<blockquote>
<h4 id="🤔-rowgetvisiblecells-❓">🤔 <code>row.getVisibleCells()</code> ❓</h4>
</blockquote>
<ul>
<li><p>컬럼 = 셀(cell)</p>
</li>
<li><p>각 행(row)에 있는 모든 셀(cell) 데이터 가져오는 함수</p>
</li>
</ul>
<br/>

<p>이런 데이터가 있다고 가정했을 때, </p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/2d7c0e13-5ee2-4609-a73f-dc238d5dae90/image.png" alt=""></p>
<p><code>row.getVisibleCells()</code> 하면 <code>[&quot;Suein&quot;, 25]</code>와 같은 데이터를 반환 할 것이다.</p>
<br/>

<p>그러니까</p>
<p>첫번째 행(row) = <code>&quot;name&quot;: &quot;Suein&quot;</code> / <code>&quot;age&quot;: &quot;25&quot;</code></p>
<p><code>2개의 셀</code>로 이루어져있다</p>
<p>ex)</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/9cf55e51-c8e6-4dce-ae70-c2df98e250e5/image.png" alt=""></p>
<p>한개의 행(row)에는 5개의 셀로 이루어져있는거지</p>
<br/>



<p>그러면 이러한 데이터들을 map으로 하나씩 꺼내서 <code>&lt;td&gt;</code>안에 내용을 집어넣는데 </p>
<pre><code class="language-js">{row.getVisibleCells().map((cell)=&gt;(
    &lt;td key={cell.id}&gt;
          {flexRender(cell.columnDef.cell, cell.getContext())}
//{cell.getValue()} : 단순 텍스트화
    &lt;/td&gt;
))</code></pre>
<Br/>

<blockquote>
<h4 id="🤔-flexrender-❓">🤔 <code>flexRender</code> ❓</h4>
</blockquote>
<ul>
<li><code>셀 데이터를 텍스트, 버튼, 아이콘, 컴포넌트 등으로 렌더링</code>하는 테이블 라이브러리 내장함수 ⭐</li>
</ul>
<br/>

<ul>
<li>🫨 <code>info</code>는 TanStack Table(React Table)에서 자동으로 전달되는 매개변수로, <code>각 셀의 정보(위치, 데이터 등)를 포함</code>하고 있다.</li>
</ul>
<br/>

<blockquote>
<h4 id="info의-주요-속성들">info의 주요 속성들</h4>
</blockquote>
<ul>
<li>row: 현재 행에 대한 정보 
<code>ex) info.row.original</code>을 사용하여 원본 데이터에 접근할 수 있음</li>
<li>column: 현재 컬럼에 대한 정보</li>
<li>getValue(): 해당 셀의 데이터 가져오는 메서드</li>
<li>row.original: 현재 행의 원본 데이터에 접근</li>
</ul>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/fedd9d67-2dcd-4933-8f52-e514c282948e/image.png" alt=""></p>
<p>이렇게 표에도 클릭할 수 있는 버튼이 생긴다</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/2411950e-d962-4044-8496-f937fd3b8d50/image.png" alt=""></p>
<hr>
<p><code>{cell.getValue()}</code>이렇게만 쓰면 React가 렌더링 할 수 있는 모든 요소로 변환(ReactNode)해줘야해서 </p>
<ul>
<li><p><strong>타입 캐스팅</strong> = (as string) /as { key: string; value: any }}</p>
</li>
<li><p><strong>문자열로 변환</strong> = <code>{String(cell.getValue())}</code></p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/afad5976-ecb4-4331-89ab-33f637e8d73f/image.png" alt=""></p>
<hr>
<br/>

<blockquote>
<h4 id="🫨-columndef-❓">🫨 ColumnDef ❓</h4>
</blockquote>
<ul>
<li>TanStack Table 라이브러리의 내장타입</li>
<li>각 컬럼을 정의하는 타입</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 - 2주차 회고록]]></title>
            <link>https://velog.io/@_ddu2ni/%EC%9C%A0%EB%8D%B0%EB%AF%B8x%EC%8A%A4%EB%82%98%EC%9D%B4%ED%8D%BC%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%BA%A0%ED%94%84-React-2%EA%B8%B0-2%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
            <guid>https://velog.io/@_ddu2ni/%EC%9C%A0%EB%8D%B0%EB%AF%B8x%EC%8A%A4%EB%82%98%EC%9D%B4%ED%8D%BC%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%BA%A0%ED%94%84-React-2%EA%B8%B0-2%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</guid>
            <pubDate>Fri, 13 Sep 2024 11:45:45 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/e5990b19-3daa-48e5-a746-0556e013bbfd/image.png" alt=""></p>
<blockquote>
<p><strong>프로젝트 기간</strong> : 2024.09.02 ~ 2024.09.27
*<em>프로젝트 주제 *</em>: React로 KTwiz 정보제공 페이지 만들기</p>
</blockquote>
<hr>
<br/>

<p>추가로 디자인 바꾸고 싶은거 의견내고 취합하느라 생각했던 것보단 시간이 걸렸지만, 공통컴퍼넌트 작업을 일요일까지 완료했다!</p>
<p>너무 친절하신 멘토님이랑 주 1회 온라인 미팅을 진행하고 있고, </p>
<p>이제는 issue랑 PR을 사용해서 충돌해결하고 merge하자고 말해서 </p>
<p>다들 어색해하는 것 같지만, 그렇게 작업중이다</p>
<br/>

<hr>
<h3 id="🔥-todo">🔥 TODO</h3>
<blockquote>
<h4 id="🫨-landing-페이지-작업">🫨 Landing 페이지 작업</h4>
</blockquote>
<p>기존 심플한 웹사이트에서 </p>
<p>ktwiz만의 구단 색깔을 살려서 강렬하고 힘이 있어보이지만 (red + black) 심플한 요소들을 살렸다.</p>
<p>그래서 디자인적인 요소를 바꿔보고자 랜딩페이지를 새롭게 꾸며보았다.</p>
<br/>

<p>└&gt; 🤔❓ <strong>Problem (문제)</strong></p>
<p>동영상을 데이터 파싱하는건 처음이라, 어떻게 해야할지 감이 안잡혀서 </p>
<p>서치를 해보니 <code>&lt;iframe&gt;</code>이라는 태그를 써서 한다고 했다. </p>
<p>기존 <code>&lt;video&gt;</code>태그랑 다른점은 </p>
<blockquote>
<ul>
<li><h4 id="video-"><code>video</code> :</h4>
웹 페이지에 직접 비디오 삽입하고 재생할 때, 재생/볼륨 등 컨트롤 할 수 있음 <br/>
<code>&lt;video controls&gt;</code>라고 적으면
<video controls> </video>
이런 비디오 모양이 뜸<br/><br/><br/></li>
</ul>
</blockquote>
<ul>
<li><h4 id="iframe-⭐"><code>iframe</code> ⭐</h4>
: 외부 웹페이지나 동영상을 현재페이지에 <code>임베드</code>할 때!
: 직접 재생하는게 아니라, 프레임 안에 외부 웹페이지를 삽입하는 역할
<br/>이번에 네이버tv를 임베드 하는거였는데, clipNo이 같이 api에 넘어왔다! <br/>
그 안에서 map으로 돌릴 때, <code>split으로 (clipNo=)을 자르게 되면</code> , [앞에주소, clipNo번호]가 나오니까 [1] 두번째 인덱스를 고르면 번호를 추출해서 임베드 할 수 있다!</li>
</ul>
<br/>

<hr>
<h3 id="📝-회고록">📝 회고록</h3>
<blockquote>
<ul>
<li><strong>Kepp (유지)</strong>
: 성공적으로 수행 / 긍정적인 경험 / 만족하는 부분 / 앞으로 유지할 부분</li>
</ul>
</blockquote>
<ul>
<li><p>랜딩페이지 전체 데이터 받아오기 성공 + UI 리뉴얼 😆</p>
</li>
<li><p><code>useFetchData 커스텀 훅 생성</code>해서 팀원들과 공유해 재사용성 ↑</p>
</li>
</ul>
<br/>

<hr>
<blockquote>
<ul>
<li><strong>Problem (문제)</strong></li>
</ul>
</blockquote>
<p>한 팀원이 혼자 계속 랜딩페이지가 데이터 fetch가 안돼서 한참을 다같이 고민하고 시간을 썼다.</p>
<br/>

<p>결론적으론 내가 커스텀 훅을 만들 때,</p>
<p>어쨌든 멘토님의 API 서버이기도하고, 보안상 + 유연성의 이유로, </p>
<p><code>.env</code>에 <code>BASE_URL</code>변수를 만들어놓고, 그걸 데이터 패치할 때 사용하고 있었는데</p>
<p>팀원이 <code>.env</code>는 gitignore에 해놨기 때문에 아무리 새로 받아도 안됐던 것이다,,,</p>
<br/>

<p>근데 우리가 문제점을 파악못하고 헤맸던 이유는</p>
<p><code>BASE_URL</code>이 없을 땐  <code>&quot;&quot;</code> 값이 없는 문자열로 해놨기때문에 </p>
<p>개발자도구에서도 에러를 발견못하고 계속 로딩중만 떴던 것이다,,</p>
<br/>

<blockquote>
<p>└&gt; 😆❗ <strong>Good Point</strong></p>
</blockquote>
<p>이번에 갑자기 인스턴스가 죽어서 api주소 변경되는 일이 생겼었다</p>
<p>한번에 바꿀 수 있어서 편했다 !!</p>
<hr>
<br/>

<blockquote>
<ul>
<li><strong>Try (시도)</strong>
: 다음 스프린트에서 시도해 볼 새로운 아이디어나 개선 사항</li>
</ul>
</blockquote>
<ul>
<li><p>*<em>랜딩페이지 *</em>
애니메이션 추가 
지난경기 하이라이트  =&gt; 하이라이트 영상에 따로 추가</p>
<br/>
</li>
<li><p>*<em>정규리그 *</em>
테이블 차트 라이브러리 TRY해서 페이지 구현 START...!!!</p>
</li>
</ul>
<p><br/><br/><br/>
_
——————————————————————————
본 후기는 본 후기는 [유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 과정(B-log) 리뷰로 작성 되었습니다._</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Web API]  - window.location]]></title>
            <link>https://velog.io/@_ddu2ni/Web-API-window.location</link>
            <guid>https://velog.io/@_ddu2ni/Web-API-window.location</guid>
            <pubDate>Thu, 05 Sep 2024 17:09:28 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="web-api">Web API</h3>
<p>: 개발하는 동안 사용할 수 있는 모든 인터페이스(객체)</p>
</blockquote>
<p>아래 공식문서에서 더 자세하고 많은 API들을 보고 경험할 수 있다.</p>
<blockquote>
<h4 id="mdn-공식문서----web-api-">MDN 공식문서  : <a href="https://developer.mozilla.org/en-US/docs/Web/API">[ web API ]</a></h4>
</blockquote>
<p><br/><br/></p>
<p>이 중에서 오늘은 <code>Breadcrumb</code>을 만들면서 그 해당 주소를 어떻게 알아야하는지에 대해서 궁금하다가  </p>
<blockquote>
<p>└&gt; 🔎 breadcrumb ?
헨젤과그레텔에서 빵 부스러기 흘리면서 길을 안내했듯이, 
유저가 웹사이트 내에 어디에 있는지 알려주는 *<em>네비게이션 텍스트 *</em></p>
</blockquote>
<br/>

<p><code>window.location</code>에 대해서 알게 되었다.
Javascript할 때 잠깐 배웠었던 기억이 있다. 
이 객체를 사용하면 현재 url이나 쿼리스트링을 알 수 있다. </p>
<pre><code class="language-js">window.location.href // 전체 url 불러오기
window.location.protocol //  :를 포함한 앞에 https: 불러오기
window.location.host //  가운데 공통 불러오기 ( : + port번호 포함)
window.location.hostname //  가운데 공통 불러오기 ( : + port번호 미포함)
window.location.pathname // /뒤의 경로인데, 이니셜과 url경로가 포함된 문자열
window.location.search //  ? 뒤의 쿼리스트링 가져오기</code></pre>
<p>기억하고 써먹어보자!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] - export 위치 차이]]></title>
            <link>https://velog.io/@_ddu2ni/React-export-%EC%9C%84%EC%B9%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@_ddu2ni/React-export-%EC%9C%84%EC%B9%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Thu, 05 Sep 2024 13:04:39 GMT</pubDate>
            <description><![CDATA[<p>예를들어, 
아래 코드처럼 컬러를 매번 번거롭게 자주 사용하는 main color들을 일일히 쓰기가 번거로워서 <code>컬러들을 변수에 담아서</code> 전역적으로 import해서 쓰려고 한다</p>
<p><br/><br/></p>
<h3 id="1번째-방법-">1번째 방법 )</h3>
<p><em>ex) 예시</em></p>
<pre><code class="language-js">const theme = {
    black: &quot;#000000&quot;,
    white: &quot;#FFFFFF&quot;,
}

export default theme;</code></pre>
<blockquote>
<p>이렇게 <code>export default theme;</code>쓰게 되면 </p>
<blockquote>
<p>① 단 하나의 변수를 내보내고
② import 할때 이름을 마음대로 지어도 된다는</p>
</blockquote>
</blockquote>
<p>장점을 가지고 있다!</p>
<p><br/><br/></p>
<h3 id="2번째-방법-">2번째 방법 )</h3>
<p><em>ex) 예시</em></p>
<pre><code class="language-js">export const theme = {
    black: &quot;#000000&quot;,
    white: &quot;#FFFFFF&quot;,
}</code></pre>
<blockquote>
<p>이렇게 <code>export + 변수선언</code>을 같이 하게 되면</p>
<blockquote>
<p>① 여러개의 변수를 내보내고 
② 변수에 이름을 지정했기 때문에 그 이름 그대로 import해야 함</p>
</blockquote>
</blockquote>
<p>잊지말고 구분해서 상황에 맞춰 쓰자!!!😆😆</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 - 1주차 회고록]]></title>
            <link>https://velog.io/@_ddu2ni/%EC%9C%A0%EB%8D%B0%EB%AF%B8x%EC%8A%A4%EB%82%98%EC%9D%B4%ED%8D%BC%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%BA%A0%ED%94%84-React-2%EA%B8%B0-1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
            <guid>https://velog.io/@_ddu2ni/%EC%9C%A0%EB%8D%B0%EB%AF%B8x%EC%8A%A4%EB%82%98%EC%9D%B4%ED%8D%BC%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%BA%A0%ED%94%84-React-2%EA%B8%B0-1%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0%EB%A1%9D</guid>
            <pubDate>Mon, 02 Sep 2024 11:41:11 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/537a9b8c-5134-446c-bf35-0cae67905e3f/image.png" alt=""></p>
<blockquote>
<p><strong>프로젝트 기간</strong> : 2024.09.02 ~ 2024.09.27
*<em>프로젝트 주제 *</em>: React로 KTwiz 정보제공 페이지 만들기 </p>
</blockquote>
<h3 id="📝-회고록">📝 회고록</h3>
<h4 id="kpt-keep--problem--try--complete">KPT (Keep – Problem – Try – Complete)</h4>
<ul>
<li><strong>Kepp (유지)</strong>
: 성공적으로 수행 / 긍정적인 경험 / 만족하는 부분 / 앞으로 유지할 부분<br/></li>
<li><strong>Problem (문제)</strong>
:프로젝트 동안 발생한 문제나 어려움<br/></li>
<li><strong>Try (시도)</strong>
:다음 스프린트에서 시도해 볼 새로운 아이디어나 개선 사항<br/></li>
<li><strong>Complete (완료)</strong>
: 완료된 것들</li>
</ul>
<br/>

<p>KPT 회고록을 많이들 사용한다고 하길래, 나도 KPT </p>
<p>회고록을 담아보려고한다</p>
<br/>


<hr>
<br/>

<p>오늘은 팀원들이랑 <code>ktwiz</code>의 프로젝트 <code>킥오프 미팅</code>을 했다</p>
<p>오늘 처음보는 팀원들이었지만 다들 밝고 성격이 좋아서 금방 친해졌다 :) 
4주간 다같이 화이팅 !!! 
<br/></p>
<hr>
<br/>

<h3 id="📒--시작">📒  시작</h3>
<ul>
<li><h4 id="1">1)</h4>
이전 프로젝트들은 맨 처음 배웠기에 당연하게 <code>cra</code>로 구동했었다. 그런데 이번엔 서버 구동이나 빌드 속도 개선을 위해 프로젝트로는 경험해보지 않았던 <code>vite</code>로 해볼까한다.<br/></li>
<li><h4 id="2">2)</h4>
상태관리는 <code>props drilling</code>을 주로 쓰고, 전역적으로 사용을 해야할 때만 <code>zustand</code>를 쓰기로 했다! 가볍고, 불필요한 코드가 적고, 직관적이기도 하고 요즘 트렌드인 zustand를 쓴 프로젝트를 경험해보고 싶었다.<br/></li>
<li><h4 id="3">3)</h4>
Git Repository 구축 (완료) 
: <del><strong>개인 git</strong>&nbsp; vs</del> &nbsp;&nbsp;&nbsp;<strong>organization [조직]</strong>으로 채택!</li>
</ul>
<h4 id="└-깃허브-주소--현재-private임">└&gt; 깃허브 주소 : 현재 private임</h4>
<h4 id="└-zustand--styled-components-라이브러리-설치">└&gt; Zustand / styled-components 라이브러리 설치</h4>
<br/>

<ul>
<li><h4 id="4">4)</h4>
프로젝트 진행 계획서
└&gt; 노션 및 피그마 기획 작업 (1주차)<br/></li>
<li>API 정의서 
: 멘토님께서 따로 postman으로 전달해주심<br/>



</li>
</ul>
<hr>
<p>우리 팀은 DB를 다뤄본 적이 없는 친구들이 대다수여서, 수업 때 배운 json-server를 이용하기로 했다.</p>
<blockquote>
<p>└&gt; <code>JSON-SEVER</code>란?</p>
</blockquote>
<ul>
<li>아주 경량화된 미니 DB다!</li>
<li>Rest API로 이루어져있어서 API를 호출할 때 restful의 디자인을 따르면 됨</li>
</ul>
<p>1) <code>npm install -g json-server</code> 설치
2) <code>db.json</code>이라는 파일 만들어서 데이터 안에 넣어주기 
└&gt; 제일 밖에 있는 root에 만들어주기!</p>
<blockquote>
<h4 id="json-server-참고">JSON-SERVER: <a href="https://velog.io/@genius_jihyepark/JSON-SERVER-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-api-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0">참고</a></h4>
</blockquote>
<hr>
<p><br/><br/></p>
<blockquote>
<h3 id="✅-개발환경-구축">✅ 개발환경 구축</h3>
</blockquote>
<p><strong>Frontend</strong>: <code>React</code> (build : vite / version : 18.3.1 / port :5173)
<strong>DataBase</strong>: <code>json-server</code></p>
<p><strong>IDE</strong>: VSCode
<strong>언어</strong>: JavaScript, TypeScript, React</p>
<p><strong>협업도구</strong>: Notion (문서화), Slack (git 연동 및 회의)
<strong>형상관리</strong>: Git (개발/배포 브랜치 전략)</p>
<p><br/><br/></p>
<hr>
<h3 id="🔥-todo">🔥 TODO</h3>
<blockquote>
<h3 id="✅-개발-일정">✅ 개발 일정</h3>
</blockquote>
<h4 id="240830-회의록"><strong>240830 회의록</strong></h4>
<p><em>*<em>0주차 킥오프 *</em></em></p>
<ul>
<li>**9/3(화) 5시 오프라인 &amp; ZEP 미팅 예정</li>
</ul>
<ul>
<li>**[ WIZonFire 컨벤션] - 더 좋은 협업을 위해 숙지 필수!!!!
<a href="https://www.notion.so/989b7f6fcade45cda35cf6ac7f0e8b9b">https://www.notion.so/989b7f6fcade45cda35cf6ac7f0e8b9b</a></li>
</ul>
<br/>

<p>우리는 제대로 하자는 마음으로 <code>Waterfall방법론(폭포수)</code>으로 진행하기로 했다. 
애자일 방법론이 아닌 폭포수 방법론을 선택한 이유는 
전통 개발 방식을 경험해보고싶기도 했고, 
배포까지 할 예정이지만 단기 기업연계 프로젝트이기도 하고, 기존에 있던 ktwiz를 벤치마킹해서 만드는 것이기 때문에 순차적으로 진행할 수 있어서 전통적인 방법으로 개발해보자! 하는 마음에 기획 + 문서정리부터 차근차근 해보려고 한다</p>
<blockquote>
<h4 id="폭포수-방법론--참고">폭포수 방법론 : <a href="https://www.codestates.com/blog/content/%EC%95%A0%EC%9E%90%EC%9D%BC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9A%A9%EC%96%B4">참고</a></h4>
</blockquote>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/a8ed9d3c-6c94-4020-ab52-99d7d4a613a9/image.png" alt=""></p>
<hr>
<h4 id="⏰--todo-list-">⏰ [ Todo List ]</h4>
<ul>
<li>각자 맡은 기능에 대한 컴포넌트 생각해오기</li>
<li>피그마 공부하기</li>
<li>부족하다고 생각하는 부분 공부하기   ex) Git - PR, issue 등</li>
<li>규칙(?)</li>
</ul>
<hr>
<h4 id="📒---meeting-day-">📒  [ Meeting Day ]</h4>
<p><em><strong>1주차 (09.02~09.06) 예정</strong></em></p>
<ul>
<li>화요일에 공통 컴포넌트 정리 및 구조 설계 진행 예정</li>
<li>프로젝트 로컬 환경 셋팅 ( + Git fork 및 clone)</li>
<li>기획 토의 (+피그마)</li>
</ul>
<hr>
<h4 id="✅--check-list-">✅ [ Check List ]</h4>
<ul>
<li>css 스타일 - styled-components</li>
<li>라이브러리는 최대한 적게 쓰기 / 구현할 수 있는건 우리가 구현해보자!</li>
<li>상태관리 - (주)props drilling  / (부) zustand는 꼭 필요할 때만</li>
<li>.prettierrc 기본 설정   / eslintrc.json
=&gt; 지수님이 (화)까지 목업 짜주시면,  수정/추가사항 같이 고민해보기</li>
<li>소통은 Discord &amp; ZEP으로! 멘토님이랑 얘기할 때만 slack으로!</li>
</ul>
<p><del>- 반응형 : 멘토님과 진행 상황공유하면서 추후 결정</del></p>
<hr>
<h4 id="☑️--todo-later-">☑️ [ Todo Later ]</h4>
<ul>
<li>Github 멘토님  초대</li>
</ul>
<hr>
<blockquote>
<ul>
<li><strong>Kepp (유지)</strong>
: 성공적으로 수행 / 긍정적인 경험 / 만족하는 부분 / 앞으로 유지할 부분</li>
</ul>
</blockquote>
<p>라이브러리를 최대한 사용하지 않도록 공통컴퍼넌트 작업 진행</p>
<p>내가 맡은 역할은 <strong>[ footer / 텍스트네비게이션 / 페이지네이션 ]</strong>  !</p>
<br/>

<blockquote>
<ul>
<li><strong>Problem (문제)</strong></li>
</ul>
</blockquote>
<ul>
<li>팀원 한명의 부재로 =&gt; 역할 재분배 필요 ❗</li>
</ul>
<BR/>


<ul>
<li>어디까지 props로 받아와야하는지, </li>
</ul>
<p>ex) selectbar가 다른 디자인으로 되어있으면 dropdown과 selectbar중에 어떤거로 사용해야하는지? </p>
<p>이런 간단한 디자인은 크게 신경쓰지않고 그대로 기존 웹사이트껄로 구현하려다보니까 </p>
<p>어디까지 똑같이 따라해야하는지 헷갈려했다.</p>
<br/>

<blockquote>
<ul>
<li><strong>Try (시도)</strong>
:다음 스프린트에서 시도해 볼 새로운 아이디어나 개선 사항</li>
</ul>
</blockquote>
<p>깃 이슈 + pr 올려서 진행하기 </p>
<p>현재 팀원들이 깃과 친하지가 않아서 공통컴퍼넌트까지만 브랜치 파서</p>
<p>구두로 완료됐다고 말해주면 pull해서 작업하고 있다. </p>
<p><br/><br/><br/>
<em>——————————————————————————
본 후기는 본 후기는 [유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 과정(B-log) 리뷰로 작성 되었습니다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[🗂️[Figma] - 단축키 정리]]></title>
            <link>https://velog.io/@_ddu2ni/%ED%94%BC%EA%B7%B8%EB%A7%88-%EB%8B%A8%EC%B6%95%ED%82%A4</link>
            <guid>https://velog.io/@_ddu2ni/%ED%94%BC%EA%B7%B8%EB%A7%88-%EB%8B%A8%EC%B6%95%ED%82%A4</guid>
            <pubDate>Mon, 02 Sep 2024 07:20:08 GMT</pubDate>
            <description><![CDATA[<hr>
<h3 id="span-stylebackground-color-fff5b1-keyboard-shortcutsspan"><span style='background-color: #fff5b1'> Keyboard Shortcuts</span></h3>
<ul>
<li><code>ctrl + alt + s</code> = 히스토리 저장 </li>
<li><code>ctrl + \</code> = 양쪽 사이드 바 hide</li>
<li><code>ctrl + alt + a</code> = select matching layers</li>
<li><code>z + 원하는 부분 드래그</code> = 드래그 확대</li>
<li><code>ctrl + shift + l</code> = 잠금 / 해제</li>
<li><code>n 누르면</code> = 다음 페이지로 이동</li>
</ul>
<br/>

<hr>
<h3 id="span-stylebackground-color-fff5b1fontspan"><span style='background-color: #fff5b1'>Font</span></h3>
<ul>
<li><code>ctrl + B</code> = 폰트 굵게</li>
</ul>
<br/>


<hr>
<h3 id="span-stylebackground-color-fff5b1frame-규격span"><span style='background-color: #fff5b1'>Frame 규격</span></h3>
<p>1920 x 1080 =&gt; 일반적인 웹사이트 규격</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[🥎 WIZonFire 프로젝트] - 야구 구단 웹사이트]]></title>
            <link>https://velog.io/@_ddu2ni/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-WIZonFire-%EC%95%BC%EA%B5%AC%EA%B5%AC%EB%8B%A8%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8</link>
            <guid>https://velog.io/@_ddu2ni/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-WIZonFire-%EC%95%BC%EA%B5%AC%EA%B5%AC%EB%8B%A8%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8</guid>
            <pubDate>Fri, 30 Aug 2024 11:46:00 GMT</pubDate>
            <description><![CDATA[<p>오늘은 팀원들이랑 <code>ktwiz</code>의 프로젝트 <code>킥오프 미팅</code>을 했다</p>
<p>오늘 처음보는 팀원들이었지만 다들 밝고 성격이 좋아서 금방 친해졌다 :) 
4주간 다같이 화이팅 !!! </p>
<ul>
<li>Git Repository 구축</li>
<li>프로젝트 진행 계획서
└&gt; 노션 및 피그마 작업</li>
<li>api 정의서 받기</li>
</ul>
<p><br/><br/></p>
<blockquote>
<p>json-server</p>
</blockquote>
<p><a href="https://velog.io/@genius_jihyepark/JSON-SERVER-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-api-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0">https://velog.io/@genius_jihyepark/JSON-SERVER-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-api-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</a></p>
<p><br/><br/></p>
<blockquote>
<h3 id="✅-개발환경-구축">✅ 개발환경 구축</h3>
</blockquote>
<p><strong>Frontend</strong>: <code>React</code> (build : vite / version : 18.3.1 / port :5173)
<strong>DataBase</strong>: <code>json-server</code></p>
<p><strong>IDE</strong>: VSCode
<strong>언어</strong>: JavaScript, TypeScript, React</p>
<p><strong>협업도구</strong>: Notion (문서화), Slack (git 연동 및 회의)
<strong>형상관리</strong>: Git (개발/배포 브랜치 전략)</p>
<p><br/><br/></p>
<blockquote>
<h3 id="✅-기능-정의">✅ 기능 정의</h3>
</blockquote>
<h3 id="🔥-todo">🔥 TODO</h3>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/0b98df8a-d264-4a05-91d5-7694f9a5f4f9/image.png" alt=""></p>
<p><br/><br/></p>
<blockquote>
<h3 id="✅-개발-일정">✅ 개발 일정</h3>
</blockquote>
<blockquote>
<h4 id="240830-회의록"><strong>240830 회의록</strong></h4>
</blockquote>
<p><em>*<em>0주차 킥오프 *</em></em></p>
<ul>
<li>**9/3(화) 5시 오프라인 &amp; ZEP 미팅 예정</li>
</ul>
<ul>
<li>**[ WIZonFire 컨벤션] - 더 좋은 협업을 위해 숙지 필수!!!!
<a href="https://www.notion.so/989b7f6fcade45cda35cf6ac7f0e8b9b">https://www.notion.so/989b7f6fcade45cda35cf6ac7f0e8b9b</a></li>
</ul>
<br/>

<p>우리는 제대로 하자는 마음으로 <code>Waterfall방법론(폭포수)</code>으로 진행하기로 했다. 
애자일 방법론이 아닌 폭포수 방법론을 선택한 이유는 
전통 개발 방식을 경험해보고싶기도 했고, 
배포까지 할 예정이지만 단기 기업연계 프로젝트이기도 하고, 기존에 있던 ktwiz를 벤치마킹해서 만드는 것이기 때문에 순차적으로 진행할 수 있어서 전통적인 방법으로 개발해보자! 하는 마음에 기획 + 문서정리부터 차근차근 해보려고 한다</p>
<blockquote>
<h4 id="폭포수-방법론--참조-설명">폭포수 방법론 : <a href="https://www.codestates.com/blog/content/%EC%95%A0%EC%9E%90%EC%9D%BC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9A%A9%EC%96%B4">참조) 설명</a></h4>
</blockquote>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/a8ed9d3c-6c94-4020-ab52-99d7d4a613a9/image.png" alt=""></p>
<hr>
<h4 id="⏰--todo-list-">⏰ [ Todo List ]</h4>
<ul>
<li>각자 맡은 기능에 대한 컴포넌트 생각해오기</li>
<li>피그마 공부하기</li>
<li>부족하다고 생각하는 부분 공부하기   ex) Git - PR, issue 등</li>
<li>규칙(?)</li>
</ul>
<hr>
<h4 id="📒---meeting-day-">📒  [ Meeting Day ]</h4>
<p><em><strong>1주차 (09.02~09.06) 예정</strong></em></p>
<ul>
<li>화요일에 공통 컴포넌트 정리 및 구조 설계 진행 예정</li>
<li>프로젝트 로컬 환경 셋팅 ( + Git fork 및 clone)</li>
<li>기획 토의 (+피그마)</li>
</ul>
<hr>
<h4 id="✅--check-list-">✅ [ Check List ]</h4>
<ul>
<li>css 스타일 - styled-components</li>
<li>라이브러리는 최대한 적게 쓰기 / 구현할 수 있는건 우리가 구현해보자!</li>
<li>상태관리 - (주)props drilling  / (부) zustand는 꼭 필요할 때만</li>
<li>border만 pixel / 나머지는 rem</li>
<li>.prettierrc 기본 설정   / eslintrc.json
=&gt; 지수님이 (화)까지 목업 짜주시면,  수정/추가사항 같이 고민해보기</li>
<li>소통은 Discord &amp; ZEP으로! 멘토님이랑 얘기할 때만 slack으로!</li>
</ul>
<p><del>- 반응형 : 멘토님과 진행 상황공유하면서 추후 결정</del></p>
<hr>
<h4 id="☑️--todo-later-">☑️ [ Todo Later ]</h4>
<ul>
<li>Github 멘토님  초대</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React + TypeScript + Zustand] - 헷갈려서 정리해보는 게시글 작성]]></title>
            <link>https://velog.io/@_ddu2ni/React-TypeScript-Zustand-%ED%97%B7%EA%B0%88%EB%A0%A4%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%B4%EB%B3%B4%EB%8A%94-%EA%B2%8C%EC%8B%9C%EA%B8%80-%EC%9E%91%EC%84%B1</link>
            <guid>https://velog.io/@_ddu2ni/React-TypeScript-Zustand-%ED%97%B7%EA%B0%88%EB%A0%A4%EC%84%9C-%EC%A0%95%EB%A6%AC%ED%95%B4%EB%B3%B4%EB%8A%94-%EA%B2%8C%EC%8B%9C%EA%B8%80-%EC%9E%91%EC%84%B1</guid>
            <pubDate>Thu, 29 Aug 2024 13:54:52 GMT</pubDate>
            <description><![CDATA[<p>📂 <code>post.store.ts</code> : 상태관리 모아두는 곳 (redux / zustand / context API)
<img src="https://velog.velcdn.com/images/_ddu2ni/post/b5253095-a572-47ba-893c-942990ab1f52/image.png" alt=""></p>
<p><em><code>async/await</code>를 사용하면 <code>비동기</code> 함수의 실행을 마치 <code>동기</code> 코드처럼 사용할 수 있다</em></p>
<p>└&gt; 이 zustand 에 해당하는 타입도 정의해주기</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/80ffd187-17d8-467e-b280-9f7b79644696/image.png" alt=""></p>
<hr>
<p><BR/><BR/></p>
<p>📂 <code>router</code> - index.ts</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/8df65ddf-600e-4327-81c5-3473079e7bc5/image.png" alt=""></p>
<p>└&gt; 위아래 코드의 차이점은 </p>
<ul>
<li>export default: 모듈에서 기본적으로 내보낼 값이 하나일 때 사용</li>
<li>export const: 여러 값을 내보낼 때 사용합니다. 모듈을 가져오는 쪽에서 import { router } from &#39;./path&#39;와 같이 중괄호를 사용하여 명시적으로 가져옵니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/90d85a2a-80a0-44a2-9b43-d05c5024ea51/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Router / json server 간단하게 정리]]></title>
            <link>https://velog.io/@_ddu2ni/9</link>
            <guid>https://velog.io/@_ddu2ni/9</guid>
            <pubDate>Thu, 29 Aug 2024 04:29:29 GMT</pubDate>
            <description><![CDATA[<h2 id="✅-학습-내용-정리">✅ 학습 내용 정리</h2>
<blockquote>
<h4 id="학습-예제-출처-수코딩">학습 예제 출처: <a href="https://www.sucoding.kr">수코딩</a></h4>
</blockquote>
<br/>

<p>점점 파일과 폴더가 늘어나면서 뭐가 뭔지 헷갈린다,,
그래서  정리해 본 ...!
<br/></p>
<h3 id="📂-파일-구조">📂 파일 구조</h3>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/12ba7798-7649-47cd-805a-41b0a2bc1b90/image.png" alt=""></p>
<hr>
<br/>

<h3 id="✏️-learned">✏️ Learned</h3>
<br/>

<h2 id="1-react-error-boundary">1. React Error Boundary</h2>
<blockquote>
<h4 id="에러-공식홈--에러바운더리--구문서">에러 공식홈 : <a href="https://ko.legacy.reactjs.org/docs/error-boundaries.html">에러바운더리 </a> ((구)문서)</h4>
</blockquote>
<ul>
<li>런타임환경에서<code>에러를 잡기위해</code> 사용하는 컴퍼넌트 
└&gt; <code>직접</code> 만들어줘야함 (but, 리액트에서 사용하는 공식문서가 있음)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/92b37e9f-7dcc-492b-90ec-fde7d73706e6/image.png" alt=""></p>
<ul>
<li><code>클래스형 컴퍼넌트</code> 코드로 작성</li>
</ul>
<br/>

<ul>
<li><p><strong><code>React Error Boundary</code> = 자바스크립트에서만 돌아가는 런타임 에러만 캐치가능!!</strong>
└&gt; React 자바스크립트 웹브라우저가 데이터 통신을 해주기때문에 그 과정에서 발생하는 에러는 리액트 에러바운더리가 인지를 못하는거였음,,, </p>
<p>웹브라우저가 데이터 통신을 해주기때문에 그 과정에서 발생하는 에그래서 이때<code>[isError, setIsError] = useState(false)</code>로 처리해줌</p>
</li>
</ul>
<p>=&gt; 타입스크립트 기반에선 에러바운더리를 하기 좀 그런데, 
자바스크립트 기반에선 충분히 에러바운더리를 사용할 수 있음</p>
<br/>

<ul>
<li>에러 컴퍼넌트를 wrapping했다...
└&gt; fallback이 뭐지,,?</li>
</ul>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/b21a8249-3d91-4826-8e2c-1046af925b8d/image.png" alt=""></p>
<p>그럼 타입스크립트 기반에선 에러바운더리는 어떻게 구성하는가??</p>
<p>개별적으로 url에 관한 에러를 처리하기 유용</p>
<p>프로젝트 진행시</p>
<p>1) 안전하게 전체프젝을 감싸는 에러 바운더리 처리를 해둠
2) try-catch 예외처리 (ex) API 데이터 통신)</p>
<h2 id="2-router-라우터">2. Router 라우터</h2>
<p><br/><br/></p>
<p>_설치하기</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/c376f0d7-d98e-4b5f-b08d-3e90cf03c9f3/image.png" alt=""></p>
<p> -main.tsx`에서 라우터설정하기</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/4445c67c-74d8-4712-b3a1-88dbe986c0c1/image.png" alt=""></p>
<h2 id="3공통레이아웃설정">3.공통레이아웃설정</h2>
<h2 id="4게시글-등록">4.게시글 등록</h2>
<ol>
<li>사용자가 무슨 값을 입력했는지 ?</li>
</ol>
<p>useStae =&gt; 객체로 
useInput =&gt; customhook</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/c566dc5d-69e4-4b43-ae96-73b01f1b450d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/bf67ca7e-4817-4526-8101-e27a26da50b4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/6458bf04-8f49-402a-ac5e-e1dcbcad19be/image.png" alt=""></p>
<p><code>&lt;pre&gt;{JSON.stringify({ title, category, writer, desc }, null, 2)}&lt;/pre&gt;</code>
<img src="https://velog.velcdn.com/images/_ddu2ni/post/8dec07ad-43cd-42b3-98f9-6f64f1b84981/image.png" alt=""></p>
<p>이미지 태그에 연결 안한 이유?
업로드 서버가 없으니,,,(우회)이미지파일을 data64문자열로 바꿔서 이미지파일로 쓸거다 </p>
<p>공통함수 vs 공통 커스텀 훅(존재하지않는 기능을 존재하는 훅을 사용해서 입맛대로 만들었기때문에)</p>
<h2 id="4-1-json-server-설치">4-1. json server 설치</h2>
<blockquote>
<h4 id="내부적으로-crud를-처리할-수-있는-기능을-제공하는-가상의-api">내부적으로 <code>crud를 처리</code>할 수 있는 기능을 제공하는 <code>가상의 API</code></h4>
</blockquote>
<p>npm install json-server</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/55149b88-c95c-472e-a2f8-d5f3ba9b196f/image.png" alt=""></p>
<p>GET방식
POST방식 : 데이터 추가할때 
PUT : 데이터 업데이트
DELETE : 데이터 삭제할때 </p>
<p>└&gt; HTTP 메서드</p>
<p>// <a href="https://localhost:3000/posts?%ED%95%84%EB%93%9C%EB%AA%85_ne=%EA%B0%92">https://localhost:3000/posts?필드명_ne=값</a> -&gt; 값이 아닌 것을 가져와요
// <a href="https://localhost:3000/posts?%ED%95%84%EB%93%9C%EB%AA%85_like=%EA%B0%92">https://localhost:3000/posts?필드명_like=값</a> -&gt; 필드명이 값과 포함되는 것을 가져와요</p>
<p>===&gt; json-server (0,17,0까지만 지원)</p>
<p>// [GET] <a href="https://localhost:3000/posts?id_ne=1">https://localhost:3000/posts?id_ne=1</a> 
// [GET] <a href="https://localhost:3000/posts">https://localhost:3000/posts</a> -&gt; posts 속성의 데이터 전체 가져오기
// [GET] <a href="https://localhost:3000/posts/1">https://localhost:3000/posts/1</a> -&gt; posts 속성의 데이터 중 id가 1인 것만 가져오기
// [POST] <a href="https://localhost:3000/posts">https://localhost:3000/posts</a> -&gt; posts 속성에 JSON 객체로 넘긴 데이터 추가하기 
// [DELETE] <a href="https://localhost:3000/posts/1">https://localhost:3000/posts/1</a> -&gt; posts 속성의 데이터 중 id가 1인 것 삭제
// [PUT/전체] <a href="https://localhost:3000/posts/1">https://localhost:3000/posts/1</a> -&gt; posts 속성의 데이터 중 id가 1인 것의 데이터 변경
// [PATCH/일부분] <a href="https://localhost:3000/posts/1">https://localhost:3000/posts/1</a> -&gt; posts 속성의 데이터 중 id가 1인 것의 데이터 변경</p>
<p>일부변경</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/810f8a70-eefa-4a16-93a4-6c4544c476f1/image.png" alt=""></p>
<p><code>&quot;all&quot;: &quot;concurrently \&quot;json-server --watch src/server/db.json --port 5500\&quot; \&quot;vite\&quot;&quot;</code>
<img src="https://velog.velcdn.com/images/_ddu2ni/post/fa2c7611-01ba-437d-b95b-79f0e1f7c8c9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/06335dee-1366-4f4e-bec0-c8a999794d98/image.png" alt="">
<img src="https://velog.velcdn.com/images/_ddu2ni/post/89845bf3-72a4-4f76-a7e8-27bc4c47dd4b/image.png" alt=""></p>
<p>탠스텍쿼리</p>
<ul>
<li>1) 최신의 데이터를 자체적으로 가져와서 업데이트를 시켜줌 
=&gt; 요청이 하나하나 계속 생김</li>
</ul>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/8f98d311-4859-42f4-96c4-d47229e20f26/image.png" alt=""></p>
<ul>
<li>2) 캐싱이 됨</li>
</ul>
<p>에러 - 주소가 틀리면 자체적으로 3번 api요청을 하고 그동안은 loading으로 처리함</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/09079db2-b56a-49ba-8cdf-0e0c79aa7138/image.png" alt=""></p>
<p>요청 횟수를 내가 정할 수도 있음</p>
<p>탠스택쿼리를 쓰는 가장 큰 이유</p>
<p>데이터 요청한게 캐싱이 됨 
-&gt; 깜빡임이 없어짐</p>
<ul>
<li><p>페이지 이탈(signal=&gt;abortcontroll)도 자도으로 해줌</p>
</li>
<li><p>렌더링 최적화가 안됨...
캐싱데이터 </p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 - 사전직무교육 8일차 후기]]></title>
            <link>https://velog.io/@_ddu2ni/%EC%9C%A0%EB%8D%B0%EB%AF%B8x%EC%8A%A4%EB%82%98%EC%9D%B4%ED%8D%BC%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%BA%A0%ED%94%84-React-2%EA%B8%B0-%EC%82%AC%EC%A0%84%EC%A7%81%EB%AC%B4%EA%B5%90%EC%9C%A1-8%EC%9D%BC%EC%B0%A8-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@_ddu2ni/%EC%9C%A0%EB%8D%B0%EB%AF%B8x%EC%8A%A4%EB%82%98%EC%9D%B4%ED%8D%BC%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%BA%A0%ED%94%84-React-2%EA%B8%B0-%EC%82%AC%EC%A0%84%EC%A7%81%EB%AC%B4%EA%B5%90%EC%9C%A1-8%EC%9D%BC%EC%B0%A8-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Wed, 28 Aug 2024 00:00:45 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/cadaf05b-fea7-4a5f-84f6-bcb0fa4a2549/image.png" alt=""></p>
<br/>


<h2 id="✅-학습-내용-정리">✅ 학습 내용 정리</h2>
<blockquote>
<h4 id="학습-예제-출처-수코딩">학습 예제 출처: <a href="https://www.sucoding.kr">수코딩</a></h4>
</blockquote>
<hr>
<br/>

<h3 id="✏️-learned">✏️ Learned</h3>
<br/>

<h2 id="1-usereducer">1. useReducer</h2>
<ul>
<li><p>전역상태관리는 아님 ❌ =&gt; 상태를 <code>효율적으로 관리</code>해주는 훅 </p>
</li>
<li><p><strong>상태관리하는 데이터가 많아질 때</strong> 사용 </p>
</li>
<li><p><strong>2개의 매개변수</strong><code>( reducer함수,0(초기값) )</code>받음 </p>
</li>
<li><p><code>reducer 함수</code>는 if문 대신 <code>switch문</code>을 주로 쓴다!</p>
</li>
<li><p>action으로 넘기는 <code>dispatch</code>는  매개변수는 무조건 1개인데, 이땐 <code>객체 형태</code>로 많이 쓴다 -&gt; <strong>확장성을 위해</strong> <code>type : &quot;action&quot;</code></p>
</li>
<li><p>reducer함수는 <code>reducer</code>폴더로 빼서 작업함 =&gt; 결합도 낮출수록⬇️ 좋음&#39;</p>
</li>
<li><p>상태관리하는 로직이 한곳에 모여있기때문에 =&gt; 유지보수 / 가독성 ⬆️</p>
</li>
</ul>
<ul>
<li><p>따로 컴퍼넌트를 뺐다면 dispatcher를 <code>props drilling</code> 방식으로 넘겨주면 됨 </p>
</li>
<li><p><code>dispatch</code>는 원리상 하나의 어플리케이션에서 한번만 생성되므로, 컴포넌트가 재렌더링하더라도 <code>한번만 렌더링</code>된다
=&gt; 🫠 useState의 차이점 (useState는 별도로 useCallback으로 최적화 렌더링을 해줘야했다)</p>
</li>
</ul>
<hr>
<br/>

<h3 id="usereducer-만드는-순서">useReducer 만드는 순서</h3>
<p>: 이런건 정답이 없지만 헷갈려서 정리해두면 좋겠다 싶어서 적어봄</p>
<blockquote>
<ol>
<li>📂reducer폴더 =&gt;  <code>export</code>해서 변수 선언하기</li>
</ol>
</blockquote>
<p><code>const todoReducer = (state:any,action:any)=&gt;{return state}</code>
<br/>일단 처음엔 다 any로 해두는게 심신안정에 좋음...</p>
<blockquote>
<ol start="2">
<li><strong>switch문</strong> 만들어주기 </li>
</ol>
</blockquote>
<blockquote>
<ol start="3">
<li><code>case &quot;ㅇㅇㅇ&quot;</code>일때 return에 원래 state때 적었던 함수 내부 내용이랑 같으니 넣기</li>
</ol>
</blockquote>
<blockquote>
<ol start="4">
<li>reducer완료 =&gt; <code>작업하던.tsx</code>에 가서 <code>useReducer(</code>export로 만들어놨던 reducer<code>,초기값)</code> 훅 써주기</li>
</ol>
</blockquote>
<br/>





<p><a href="https://ccomccomhan.tistory.com/281">https://ccomccomhan.tistory.com/281</a></p>
<p><br/><br/></p>
<hr>
<h2 id="2-zustand">2. zustand</h2>
<p>: <strong><code>전역상태관리</code></strong></p>
<br/>

<ul>
<li>설치는 이것만 하면 끝난다...so very 간단</li>
</ul>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/d1875302-8424-4e67-848a-b7b75bc7b4a1/image.png" alt=""></p>
<ul>
<li><p>set함수 = 현재상태(state)를 인자로 받고 -&gt; 새로운 상태 만들기</p>
</li>
<li><p>state = 현재상태에서 속성에 접근하기위해선 state.xxx라고 해야한다.</p>
</li>
</ul>
<hr>
<p>비구조할당 받아서 컴포넌트 작업했었는데, </p>
<p>메모이제이션 하려고 했는데 안된다,,,오잉 🔎</p>
<h4 id="zustand의-최적화-방법메모이제이션">zustand의 최적화 방법(메모이제이션)</h4>
<blockquote>
<h4 id="zustand-공식-홈-zustand">Zustand 공식 홈: <a href="https://zustand-demo.pmnd.rs/">zustand</a></h4>
</blockquote>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/11d80602-e67e-48eb-9ca5-694b8bd5e3df/image.png" alt=""></p>
<p>: 비구조할당이 아닌 <code>하나씩 꺼내오는 방식</code>으로 작업하면 렌더링 최적화가 가능하다</p>
<p>=&gt; Zustand에서 공식문서에서 지향</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/fd818bf1-3f91-4ace-b6c4-3b31974361cf/image.png" alt="">
└&gt; zustand에서 하나씩 꺼내오는 방식으로 한다고 해서 <code>컴포넌트 메모이제이션(React.memo(컴퍼넌트)</code>💡 하는 방법이 없으면 안됨!  있어야함</p>
<hr>
<p><Br/><Br/></p>
<h2 id="2-데이터-통신">2. 데이터 통신</h2>
<h4 id="2-1-싱글페이지single-page-application--spa">2-1. 싱글페이지(Single Page APPlication , SPA)</h4>
<blockquote>
<h4 id="장점-">장점 :</h4>
<p>① <code>단일 페이지</code> 구성 
② 페이지 요청 시 <code>필요한 데이터</code>만 전달받아서 트래픽 감소⬇️
③ 전체 페이지 렌더링 ❌ <code>변경된 부분만 갱신</code>하므로(새로고침 X ) 사용자 경험 향상 ⬆️<BR/><BR/></p>
<h4 id="단점-">단점 :</h4>
<p>① 웹에 필요한 모든 리소스를 <code>최초에 한번에 다운</code> =&gt; <code>느림</code>
② 서버렌더링 방식이 아닌 자바스크립트 기반 비동기 모델이라 <code>검색최적화(search engine optimization, SEO) 이슈 有</code></p>
</blockquote>
<p>💡 SPA 참고 : <a href="https://m.blog.naver.com/seek316/222085340333">SPA</a></p>
<bR/>

<hr>
<h4 id="2-1클라이언트-사이드-렌더링client-side-rendering-csr">2-1.클라이언트 사이드 렌더링(Client Side Rendering, CSR)</h4>
<blockquote>
<p>(&lt;-<strong>React</strong> 해당): </p>
</blockquote>
<h4 id="특징-">특징 :</h4>
<p>모든걸 웹브라우저로 불러와야지만, 필요한 정보만 요청하고 변화된 부분만 렌더링하므로 =&gt;<code>웹브라우저가 화면을 구성</code>한다.</p>
<blockquote>
<h4 id="단점">단점</h4>
<p>: api통신이 웹페이지가 생성된 다음에 들어가므로 찰나의 깜빡임이 존재함 =&gt; csr의 한계,,,🥲</p>
</blockquote>
<bR/>

<hr>
<h4 id="2-1-서버-사이드-렌더링server-side-rendering-ssr">2-1. 서버 사이드 렌더링(Server Side Rendering, SSR)</h4>
<blockquote>
<p>(&lt;- <strong>Next.js</strong> 해당):
<code>서버에서 이미 완성되어져있는 걸 응답받는다.</code></p>
<h4 id="장점--1">장점 :</h4>
<p>① 초기로딩 빠름
② html의 body에 content가 담겨있기때문에 SEO(검색최적화 엔진)에 좋다
<BR/></p>
<h4 id="단점--1">단점 :</h4>
<p>① 모든 요청에 대해 완전 새로 렌더링 한다
② 서버 과부화 </p>
</blockquote>
<p>💡 CSR/SSR참고 : <a href="https://velog.io/@aseungbo/CSR-SSR">CSR/SSR</a></p>
<bR/>

<hr>
<h4 id="2-2-fetch-api">2-2. fetch API</h4>
<p>: 웹브라우저에서만 사용가능
: 웹브라우저가 기본으로 제공하는 기능</p>
<blockquote>
<p>axios 
: 외부 라이브러리에서 사용하는 옵션기능 </p>
</blockquote>
<bR/>


<hr>
<Br/>


<h3 id="2-3-🛜server---터미널-입력">2-3. 🛜server - 터미널 입력</h3>
<br/>

<p><strong>┌&gt; 1️⃣&nbsp; &nbsp; Node에서 기본적인 package.json 파일을 생성</strong></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/8245fdb2-ab0a-45fe-8bf4-243b6eae5403/image.png" alt=""></p>
<Br/>

<p> <strong>┌&gt; 2️⃣&nbsp; &nbsp; Node.js 프로젝에 cors,express,nodemon 패키지를 설치</strong></p>
<p><code>cors</code></p>
<ul>
<li>CORS(Cross-Origin Resource Sharing)를 처리하는 미들웨어</li>
<li>다른 도메인에서 오는 요청을 허용 or 제한</li>
</ul>
<p><code>express</code></p>
<ul>
<li>Node.js에서 서버를 구축 =&gt; 웹 프레임워크</li>
<li>라우팅, 미들웨어 관리, 요청/응답 처리</li>
</ul>
<p><code>nodemon</code></p>
<ul>
<li>Node.js 애플리케이션을 자동으로 재시작해주는 도구 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/0ffa3bcc-a88d-46a9-a0ac-91cb1712d08d/image.png" alt=""></p>
 <br/>


<p><strong>┌&gt; 3️⃣&nbsp;&nbsp;  Node서버 시작</strong>
<img src="https://velog.velcdn.com/images/_ddu2ni/post/2feafe5c-0b66-4af0-82f9-20c8bb153aaf/image.png" alt=""></p>
<p><Br/><Br/></p>
<hr>
<h3 id="2-4📥-데이터-통신의-4가지-방법과-순서-이해하기">2-4.📥 데이터 통신의 4가지 방법과 순서 이해하기</h3>
<ol>
<li>데이터 불러오는 방법 fetch</li>
<li>로딩상태 핸들링</li>
<li>에러핸들링</li>
<li>API 요청이 끝나기 전에 사용자가 이탈할 때 </li>
</ol>
<p><BR/><BR/></p>
<hr>
<h3 id="🫠-강의실습---lets-make-it-together">🫠 [강의실습] - Let&#39;s make it together!</h3>
<blockquote>
<h4 id="웹브라우저에서-데이터-통신하는-법-2가지-🛜">웹브라우저에서 데이터 통신하는 법 2가지 🛜</h4>
<blockquote>
<ul>
<li>fetch api
: 웹브라우저가 제공<br/><br/></li>
<li>axios 라이브러리 
: 라이브러리가 제공 (범용성 &amp; 기능up)</li>
</ul>
</blockquote>
</blockquote>
<p><br/><br/></p>
<p><code>tmdb API 🍿</code>를 불러와서 데이터를 받아보자!</p>
<p><br/><br/></p>
<p><em>홈페이지 하단 아래 API 클릭</em></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/e573cfc7-66c3-4377-95a9-48becbd8cf00/image.png" alt=""></p>
<p><br/><br/></p>
<p>_<code>API Reference</code> 메뉴바 클릭 _</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/f73b1a03-16a1-40bd-967c-b3efe5c88320/image.png" alt=""></p>
<p><br/><br/></p>
<p><em><code>Url</code>확인 후 JSON형식으로 어떻게 받아오는지 체크</em></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/caabacac-c8a7-4229-b4b2-18db0a73f3ea/image.png" alt=""></p>
<hr>
<p>예를 들어 <code>jsonplaceholder</code>에서 예시url을 들고와서 <code>fetch api</code>로 데이터 통신을 해보자!</p>
<br/>


<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/c0098253-d337-4c47-9a1f-82797dfadeca/image.png" alt=""></p>
<p>fetch라는 api를 만나게 되면 기다리지 않고 다음 코드를 시작하게 됨 </p>
<p>그 간극이 짧으니까 fullfilled 상태가 되지 못하고 pending으로 보였는데, 비동기방식이니까 그사이에 fulfilled가 된 거다!</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/06cf3264-9bad-40be-a0ad-8d1b11800cc6/image.png" alt=""></p>
<p><br/><br/></p>
<p>promise를 반환하려면 then을 써줘야함</p>
<p>then이라는 콜백함수로 response 응답결과를 받아준다. 이땐, 변수로 정의안해도 됨!</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/ed248ee3-a055-4dad-a284-c265c07eac19/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/bf6e337d-d3e4-4e72-86cd-770b85e80087/image.png" alt=""></p>
<p>fetch는 기본적으로 then을 2번 사용해야함</p>
<p>then을 한번 더 써줘야하는 이유?</p>
<p>response.json()은 promise객체를 반환하니까 then 쓸 수 있음</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/2f05e521-2665-4509-a3fe-a05764085ae4/image.png" alt=""></p>
<p><br/><br/></p>
<p><br/><br/><br/>
<em>——————————————————————————
본 후기는 본 후기는 [유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 과정(B-log) 리뷰로 작성 되었습니다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 - 사전직무교육 7일차 후기]]></title>
            <link>https://velog.io/@_ddu2ni/6%EC%9D%BC-9narqlx7</link>
            <guid>https://velog.io/@_ddu2ni/6%EC%9D%BC-9narqlx7</guid>
            <pubDate>Tue, 27 Aug 2024 00:16:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/441654fc-e0b1-437b-9c0a-fddd7ffa0b90/image.png" alt=""></p>
<br/>


<h2 id="✅-학습-내용-정리">✅ 학습 내용 정리</h2>
<blockquote>
<h4 id="학습-예제-출처-수코딩">학습 예제 출처: <a href="https://www.sucoding.kr">수코딩</a></h4>
</blockquote>
<br/>

<h3 id="✏️-learned">✏️ Learned</h3>
<br/>

<h2 id="1-usetransition">1. useTransition</h2>
<ul>
<li><p>동시성 모드 훅</p>
</li>
<li><p><code>&lt;useTransition&gt;</code>이 부분으로 감싸진 <strong><code>코드 블럭</code></strong>의  우선순위를 낮춤 🔽</p>
</li>
</ul>
<br/>

<h2 id="2-usedefferedvalue">2. useDefferedValue</h2>
<ul>
<li><p><strong><code>특정 값</code></strong>의 우선순위를 낮춤 🔽</p>
<br/> 
</li>
<li><p>변수로 받아서 우선순위를 낮추고싶은 state를 넣는다
<code>const deferredValue = useDeferredValue(dummy);</code> </p>
</li>
</ul>
<br/>

<h2 id="3-메모이제이션">3. 메모이제이션</h2>
<h3 id="3-1-usecallback">3-1. useCallback</h3>
<p>함수값을 메모리에 저장해놨다가 가져다 쓰는 방법</p>
<blockquote>
<h4 id="export-default-reactmemo컴퍼넌트이름br"><code>export default React.memo(컴퍼넌트이름)</code>;<br/></h4>
<p>: 컴퍼넌트가 메모리에 저장되어있어서 전달함
: 불필요한 재렌더링 방지</p>
</blockquote>
<p>메모이제이션은 남발하면 성능저하 🔽 일으킬 수 있음!</p>
<blockquote>
<h4 id="메모이제션-컴퍼넌트-구분">메모이제션 컴퍼넌트 구분</h4>
</blockquote>
<ul>
<li><code>반복 렌더랑</code> :  메모이제션</li>
<li>그 외     : 선택적</li>
</ul>
<blockquote>
<h4 id="🔎-메모이제이션-메모리가-퓰어질-때-">🔎 메모이제이션 메모리가 퓰어질 때 ?</h4>
<p>컴퍼넌트 <code>전달받은 props</code>가 데이터<code>변경</code>될 때 </p>
</blockquote>
<pre><code class="language-js"> const increment = () =&gt; {
    setCount((count) =&gt; count + 1);
  };</code></pre>
<p>increment안에 값이 들어가있을 것 같지만, 참조자료형이라 주소값이 들어가있기 때문에 함수가 늘어난다</p>
<br/>

<blockquote>
<h3 id="usecallback">useCallback</h3>
<p>: 함수를 메모이제이션 하기 위해 사용됨</p>
</blockquote>
<br/>

<p>⭐------------------------------------------------------</p>
<h4 id="1-컴퍼넌트-메모이제이션--reactmemo리액트패키지의-메모함">1) 컴퍼넌트 메모이제이션 ; React.Memo(리액트패키지의 메모함)</h4>
<p>메모이제이션 해지할때?</p>
<p>└&gt;컴퍼넌트로 전달받은 데이터가 변경될 때 
└&gt;context로 공급받은 데이터가 변경될 때 </p>
<h4 id="2-함수-메모이제이션--usecallback">2) 함수 메모이제이션 : useCallback</h4>
<p>└&gt;의존성 배열에 있는 데이터가 비었을 때  = 메모이제이션 절대 풀리지 않음</p>
<p>└&gt; useCallback을 했을 때, 리액트는 함수 scope(비슷한 말로 상태)를 기억함</p>
<ul>
<li>콜백함수 형태 : 원래(이전) 형태의 값을 참조할거면 =&gt; 최신값을 보장함 </li>
<li>value 형태 :이전 값 참조 안해도될 때</li>
</ul>
<p>🔽 그래서 아래 코드에서 count는 콜백함수형태로 작성해야 좋다</p>
<pre><code class="language-js">const [count, setCount] = useState({ count: 0 });

  //useCallback (()=&gt;{},[])
const increment = useCallback(() =&gt; {
    setCount((count) =&gt; ({ count: count.count + 1 })); //콜백함수형태 = 최신값을 보장함
    //{ count : 0 } 을 기억하고있어서 value형태로 작성하면
    // setCount({ count: count.count + 1 }); //value형
  }, []);

</code></pre>
<h4 id="3-값-메모이제이션--usememo">3) 값 메모이제이션 : useMemo</h4>
<p>└&gt;의존성 배열에 있는 데이터가 비었을 때  = 메모이제이션 절대 풀리지 않음</p>
<p>⭐------------------------------------------------------</p>
<br/>
<br/>

<p><code>useMemo (()=&gt;{return&quot;&quot;&quot;},[])</code>  =&gt; (메모이제이션, 의존성배열)
<img src="https://velog.velcdn.com/images/_ddu2ni/post/9cbfb642-d7a2-47a9-8a16-55f03efc7f06/image.png" alt=""></p>
<p>객체로 변경하게 되면 , props는 객체일텐데 메모이제이션이 풀리지않음</p>
<blockquote>
<h4 id="usestate는-내장되어있는-것처럼-자동으로-메모이제이션되는-훅임">useState는 내장되어있는 것처럼 자동으로 메모이제이션되는 훅임</h4>
</blockquote>
<ul>
<li>관리하는 데이터가 변경될 때 메모이제이션 변경</li>
</ul>
<p><br/><br/></p>
<h3 id="3-2-usememo">3-2. useMemo</h3>
<p>: 값을 메모이제이션 (재렌더링 방지)</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/57f700a2-d791-49e6-ba3f-25def065fdeb/image.png" alt=""></p>
<br/>

<hr>
<h3 id="🫨-리액트의-고차컴퍼넌트higher-order-component에-대한-이해">🫨 리액트의 고차컴퍼넌트(Higher-Order-Component)에 대한 이해?</h3>
<p>└&gt; 고착컴퍼넌트가 뭐야 🔎</p>
<p>컴퍼넌트로 매개변수를 받아서 다시 컴포넌트를 반환하게 하는 컴퍼넌트임</p>
<p>ex) React.Memo(컴포넌트형) =&gt;  컴퍼넌트를 응답받음</p>
<p><br/><br/></p>
<hr>
<h3 id="3-3-todo-메모이제이션">3-3. Todo 메모이제이션</h3>
<h4 id="🔎-todolist를-메모이제이션-해야하는이유">🔎 TodoList를 메모이제이션 해야하는이유?</h4>
<p>= 최적화가 필요한 이유?</p>
<p>: 반복화 = 메모이제이션 하면 좋다!</p>
<blockquote>
<p>Todo를 1번 입력하면 </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/b179ae02-3be4-43ed-b9a1-9f7b67412e09/image.png" alt=""></p>
<blockquote>
<p>Todo를 2번 입력하면 
: 이전에 렌더링 된 것이 <code>초기화돼서 다시 불러와짐</code></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/a18a5bc7-e2eb-4031-8cfa-f9835d55d840/image.png" alt=""></p>
<hr>
<p>todo리스트를 메모이제이션 하는데 
개념이 잘 안잡혔나보다,,, </p>
<p>1) 컴퍼넌트 메모이제이션을 사용해서 , 컴퍼넌트 트리구조를 생각하고 그 안에서 원하는거 <code>React.memo()</code> 하기!</p>
<p>=&gt; 막아지지 않았단 얘기는 props가 변경되었을 때 !</p>
<p>2) useState는 메모이제이션이 자동으로 된 것처럼 작동함</p>
<ul>
<li><p>todos는 메모이제이션 할 대상이 아님 - useState라서</p>
</li>
<li><p>나머지 toggle /delete 만 메모이제이션 바꾸면 됨 </p>
</li>
<li><p>그 함수가 직접적으로 영향을 받는 맨 상위 곳에서 메모이제이션 하자!</p>
</li>
</ul>
<p><Br/><br/></p>
<h3 id="4-context-api">4. Context API</h3>
<p>:Provider-Consumer</p>
<blockquote>
<h3 id="span-stylecolorgreybeforespan-기존"><span style="color:grey">before)</span> 기존</h3>
<p>: root 컴퍼넌트 -&gt; 하위 컴퍼넌트 전달</p>
</blockquote>
<blockquote>
<h3 id="span-stylecolorgreyafterspan-context-api"><span style="color:grey">after)</span> Context API</h3>
<p>: context라는 영역에 데이터 정의 -&gt; 원하는 데이터 요청 - &gt; 전달받기 </p>
</blockquote>
<p>--안티패턴......</p>
<ol>
<li>createContext =&gt; 공급자 생성</li>
<li>1번context.Provider 범위설정</li>
<li>그 범위 안에 value 속성으로 데이터 모아두기</li>
<li>다른 컴퍼넌트에서 useContext(1번컴퍼넌트이름);을 받아서 사용
ex) <code>const { count } = useContext(CounterContext)!;</code></li>
</ol>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/bbc2bf56-3bcc-44cb-b9ae-ffaa551e1964/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/a80351db-84ba-4cb3-92f5-0434526e9ce9/image.png" alt=""></p>
<br/>

<h4 id="🔎🫨-그럼-어떻게-실무에선-하는데">🔎🫨 그럼 어떻게 실무에선 하는데?</h4>
<br/>

<ol>
<li><code>context</code>라는 <code>폴더</code> 만들고</li>
<li>그 안에 <code>이름 + Provider.tsx</code> 공급자 파일을 만들고 </li>
<li><code>children</code>을 사용함</li>
<li>그 공급자파일을 전체 root 상위 컴퍼넌트를 감싸기!</li>
</ol>
<p>=&gt; 유지보수와 재사용성이 좋아짐 👏🏻</p>
<p><br/><br/></p>
<p>——————————————————————————
<em>본 후기는 본 후기는 [유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 과정(B-log) 리뷰로 작성 되었습니다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 - 사전직무교육 6일차 후기]]></title>
            <link>https://velog.io/@_ddu2ni/6%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@_ddu2ni/6%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 26 Aug 2024 00:01:07 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/fb91d26b-74ca-42b0-aa23-1ae090c9bce6/image.png" alt=""></p>
<Br/>
<Br/>

<h2 id="✅-학습-내용-정리">✅ 학습 내용 정리</h2>
<blockquote>
<h4 id="학습-예제-출처-수코딩">학습 예제 출처: <a href="https://www.sucoding.kr">수코딩</a></h4>
</blockquote>
<p><br/><br/></p>
<p>시작하기 전에 앞서서 </p>
<h3 id="💡-strictmode-알아두기">💡 <code>&lt;StrictMode&gt;</code> 알아두기</h3>
<ul>
<li><code>main.tsx</code>에 있음!</li>
<li>해지하면 콘솔창에서 1번씩 실행될거임</li>
<li>개발모드에서만 console창에서 두번씩 출력되게 해놓음</li>
<li>되도록 제거하지 않은 상태로 진행해보자!</li>
</ul>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/79d45d4a-9a0e-4ee8-8907-19bf5b8efd28/image.png" alt=""></p>
<hr>
<h3 id="🔎-hook-이-뭘까">🔎 <code>&lt;hook&gt;</code> 이 뭘까?</h3>
<ul>
<li>React state랑 생명주기랑 연동(hook into)할 수 있게 해주는 함수</li>
</ul>
<hr>
<br/>

<h3 id="✏️-learned">✏️ Learned</h3>
<br/>

<h2 id="1-useeffect-⭐⭐⭐">1. useEffect ⭐⭐⭐</h2>
<p>└&gt; 컴포넌트의 <strong>생명주기관리</strong>를 도와주는 hook</p>
<br/>

<blockquote>
<h3 id="🔎-생명주기란">🔎 생명주기란?</h3>
<p>: 컴퍼넌트가 <strong>생성</strong>되고 <strong>삭제</strong>되는 순간까지의 일련주기</p>
</blockquote>
<p>*<em>└&gt; 생성 / 수정(업데이트 / 삭제) *</em> </p>
<p><br/><br/></p>
<h3>📌기본 함수 공식</h3>

<p><code>useEffect(콜백,의존성배열)</code>
=&gt; <code>useEffect(( )=&gt;{ },[ ])</code></p>
<br/>

<hr>
<br/>

<h3 id="🔎-useeffect-언제-사용할까"><strong>🔎 useEffect 언제 사용할까?</strong></h3>
<ul>
<li><p>컴포넌트가 렌더링 될 때 특정 작업(<code>API 호출</code>⭐ 등)을 수행하거나, 언마운트될 때 정리하기 위해 사용됨</p>
<ul>
<li>목적과 상황에 따라 여러번 쓸 순 있지만, 의존성 배열이 달라야 함</li>
</ul>
<blockquote>
<h4 id="분리해서-썼을-때-">분리해서 썼을 때 ?</h4>
</blockquote>
<ul>
<li>생성시점과 종료시점을 <code>다시 실행시킬 필요가 없으니 분리</code>시킬 수 있음 </li>
<li>생성시점과 종료시점이 <code>한번만 실행</code>되길 보장하면 -&gt; 분리해서 작성</li>
</ul>
<blockquote>
<h4 id="분리해서-작성안해도될-땐-">분리해서 작성안해도될 땐 ?</h4>
</blockquote>
<ul>
<li>[의존성 배열] 변경될 때마다 <code>생성+종료가 계속 실행</code>됨</li>
</ul>
</li>
<li><p>[의존성 배열] 안에 적어도 적어놔도 됨</p>
<p><br/><br/></p>
</li>
</ul>
<h3 id="1-1-useeffect-생성">1-1. useEffect [생성]</h3>
 <br/>

<p> 확인해보면 화면이 켜지고 콘솔창에 뜸</p>
<p> <img src="https://velog.velcdn.com/images/_ddu2ni/post/69c427bb-e985-43a8-a25b-fb7cb8bd8cd3/image.png" alt=""></p>
<hr>
<h3 id="1-2-useeffect-삭제">1-2. useEffect [삭제]</h3>
<p> = <code>clean up</code> 함수</p>
<p> <img src="https://velog.velcdn.com/images/_ddu2ni/post/2dffc545-2e83-43a5-a0e9-5177107a5200/image.png" alt=""></p>
<p> <img src="https://velog.velcdn.com/images/_ddu2ni/post/c04724e7-6da6-4ed9-bfb9-bafd05ca1f35/image.png" alt=""></p>
<ul>
<li><p><code>&lt;strict&gt;&lt;/strict&gt;</code>모드가 사용되는 중이면, 
내부적으로 한번 만들었다가 이상이 없으면 지워주기때문에 <code>삭제</code>가 보임 </p>
</li>
<li><p><code>&lt;strict&gt;&lt;/strict&gt;</code>모드를 사용안하면 눈에 안보임</p>
<hr>
</li>
</ul>
<blockquote>
<h4 id="useeffect는-async-비동기를-사용하지-못함-⭐">useEffect는 <code>async 비동기</code>를 사용하지 못함 ⭐</h4>
<p>: 콜백함수를 내부에서 반환하는데 이땐 동기 함수로 작동 해야하기때문에 !</p>
</blockquote>
<ul>
<li><h4 id="aysnc는-항상-promise를-반환함">aysnc는 항상 Promise를 반환함</h4>
<p>└&gt; 🔎 <code>Promise</code>가 뭐지?</p>
</li>
<li><p>작업의 결과가 promise 객체에 저장</p>
</li>
<li><p>promise 객체는 3가지 중 1개의 상태</p>
<blockquote>
<p>pending : 작업이 진행중
fulfilled : 작업이 성공적으로 완료
rejected : 작업이 실패했음</p>
</blockquote>
</li>
<li><p>비동기 작업을 순차적으로 실행하기 위해서 사용함</p>
</li>
<li><p>3가지 메서드 (then / catch / finally)</p>
</li>
</ul>
<p><br/><br/></p>
<hr>
<p>혹시 async비동기를 쓰고싶다면 useEffect 내부에 이렇게 쓰는 방법도 있는데, 나중에 배우게 될 것 같다! </p>
<p> <img src="https://velog.velcdn.com/images/_ddu2ni/post/5fab8b43-fa34-4c80-9c00-d5bb37b1d79b/image.png" alt=""></p>
<p>  <br/> <br/></p>
<hr>
<h3 id="1-3-useeffect-수정--업데이트">1-3. useEffect [수정 / 업데이트]</h3>
<p>  : 한번만 실행하고 싶다면, 의존성배열에 [ ] 해당 객체 넣어두기</p>
<p> <img src="https://velog.velcdn.com/images/_ddu2ni/post/15776393-4533-4c18-b295-9f6b9fa66923/image.png" alt="">
<img src="https://velog.velcdn.com/images/_ddu2ni/post/fa5609ca-7ec3-44dc-abde-e8882a3095ae/image.png" alt=""></p>
<p>  <br/>  <br/></p>
<ul>
<li><p>메모리가 삭제되고 다시 생성돼서 실행되니까 변경사항이 체크됨</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/5ad0ec84-664a-4ce3-8e61-24a9cfe85863/image.png" alt=""></p>
</li>
</ul>
<p> <img src="https://velog.velcdn.com/images/_ddu2ni/post/d5079689-a5eb-4361-b753-be23383c2589/image.png" alt=""></p>
<p> <br/> <br/></p>
<p><strong>🔎 useEffect <code>삭제</code>는 왜 필요할까?</strong></p>
<p> setTimeOut / setInterval 은 초기화해주는 코드를 꼭 넣어줘야함</p>
<p>  안그럼 인터벌 코드가 화면에서 삭제되었음에도 불구하고 계속 메모리가 살아있음</p>
<p>= <code>메모리누수</code>를 방지하기위해!</p>
<p>  <img src="https://velog.velcdn.com/images/_ddu2ni/post/27966907-e392-49f6-bc2d-7d5ae89a9ee9/image.png" alt=""></p>
<p><br/> <br/></p>
<hr>
<h3 id="2-useeffect를-활용한-darkmode만들기-🌛">2. useEffect를 활용한 DarkMode만들기 🌛</h3>
<blockquote>
<h4 id="tailwind-css-이용">tailwind css 이용</h4>
</blockquote>
<br/>

<p>class명에 <code>dark:</code>를 붙이면 <code>다크모드</code>일 때 쓰고싶은 css가 적용됨</p>
<p>darkMode는 index.html에 다크모드를 설정하면 됨</p>
<p><img src="https://velog.velcdn.com/images/_ddu2ni/post/31836dff-28a1-4b38-9a6e-4886f601d2a8/image.png" alt=""></p>
<p><br/><br/>  </p>
<p>&quot;다크모드 &quot;일 땐, class에 dark 붙여짐 
<img src="https://velog.velcdn.com/images/_ddu2ni/post/949be8e5-0da8-40a0-91cf-8f8cb331c395/image.png" alt=""></p>
<hr>
<hr>
<h3 id="3-uselayouteffect-훅">3. useLayoutEffect 훅</h3>
<blockquote>
<h3 id="useeffect">useEffect</h3>
</blockquote>
<ul>
<li>컴퍼넌트가 생성되고, <strong><code>렌더링(화면에 보여진) 다음에 비동기적</code></strong>으로 처리함</li>
<li>깜빡임을 볼 수 있다</li>
<li>** ex) 데이터 통신**</li>
</ul>
<blockquote>
<h3 id="uselayouteffect">useLayoutEffect</h3>
</blockquote>
<ul>
<li><strong><code>동기적</code></strong>으로 실행되는 hook이어서, 컴퍼넌트가 생성되고나서 <strong><code>렌더링 되기 전에 실행</code></strong>되므로, 깜빡임이 없다</li>
<li>이 코드가 실행되는 동안은 동기적인 훅이라서 *<em><code>다른 기능들을 실행할 수 없음</code> *</em>🥲</li>
<li><strong>ex) 레이아웃 변경</strong></li>
</ul>
<p>=&gt; 단순 html 변경 등을 제외하곤 <code>useEffect</code>를 쓰는게 좋음</p>
<br/>
<br/>

<h3 id="4-실습과제-point">4. 실습과제 point</h3>
<blockquote>
<h3 id="useeffect-1">useEffect</h3>
</blockquote>
<ul>
<li>filter((item)=&gt;item.name.includes(terms)) : 해당 단어가 포함된거 필터처리하기</li>
</ul>
<br/>

<p><strong>이거 필요</strong>
-입력요소에 렌더링되는거 -&gt; 한번만 렌더링되게 <code>debounce</code></p>
<br/>


<p>프롭스 드릴링 방식으로 설계함</p>
<p>-&gt; depth가 짧으면 props drilling방식이 이득이지만, zustand나 redux contextAPI를 이용해봐도 괜찮음</p>
<hr>
<p>컴퍼넌트는 데이터를 전달할 때 위에서 아래로밖에 못주는데,
state lift 기법을 사용해야한다.</p>
<p>부모영역에서 state를 만들어야함</p>
<p><br/><br/></p>
<h3 id="5-useid">5. useId</h3>
<p> React 18에 새로 추가된 <code>유니크한 id를 만들어주는 hook</code></p>
<ul>
<li>컴포넌트의 최상위 수준에서 호출하여 고유한 ID를 생성</li>
<li>반복문이나 조건문 내에서 호출할 수 없음</li>
</ul>
<p><br/><br/></p>
<h3 id="6-usetransition">6. useTransition</h3>
<p><code>const [pending, startTranstion] =  useTransition()</code></p>
<p>과부화를 낮춰주는 훅 (무거운 코드들을 startTranstion으로 wrapping하면)</p>
<ul>
<li><p>특정 코드블럭= starter함수 안의 우선순위를 낮춰버리기떄문에 가능</p>
</li>
<li><p>동시성 (=비동기 / 코드의 실행을 기다리지 않겠음) </p>
</li>
<li><p>리액트에선 잘 쓰진않지만 next에선 엄청 잘 쓰인다</p>
</li>
</ul>
<p><br/><br/></p>
<p>——————————————————————————
<em>본 후기는 본 후기는 [유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 과정(B-log) 리뷰로 작성 되었습니다.</em></p>
]]></description>
        </item>
    </channel>
</rss>