<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>flick_react1.log</title>
        <link>https://velog.io/</link>
        <description>.</description>
        <lastBuildDate>Tue, 12 Nov 2024 14:45:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>flick_react1.log</title>
            <url>https://velog.velcdn.com/images/flick_react1/profile/a63afc65-0c04-4b2c-9f96-b447295a7e08/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. flick_react1.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/flick_react1" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[오류 내용은 먼저 제대로 읽고 보자]]></title>
            <link>https://velog.io/@flick_react1/%EC%98%A4%EB%A5%98-%EB%82%B4%EC%9A%A9-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%9D%BD%EA%B8%B0</link>
            <guid>https://velog.io/@flick_react1/%EC%98%A4%EB%A5%98-%EB%82%B4%EC%9A%A9-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%9D%BD%EA%B8%B0</guid>
            <pubDate>Tue, 12 Nov 2024 14:45:35 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/flick_react1/post/2d429460-0a97-4029-a683-96019a408542/image.png" alt=""></p>
<p>*<em>강의를 참고하며 코드를 따라 적는 중 오류 발생 *</em></p>
<p>*<em>분명 그대로 똑같이 쳤는데 문제가 발생한것에 의아해서 작성하던 코드단락을 확인 
*</em>
<img src="https://velog.velcdn.com/images/flick_react1/post/8939c0fc-da5e-47af-a992-0d74243694c7/image.png" alt="">
*<em>e가 할당되지 않았다고 뜨는데 이 때문에 오류가 생긴거구나 하고 그냥 넘기는 섣부른 판단을 함
*</em></p>
<p><strong>하지만 다른 부분에서 누락한 코드도 없었기 때문에 계속 의문 
**
*<em>그제서야 첫번째 사진의 해당 화면을 확인 
*</em>
<code>ReferenceError: useNavigate is not defined</code>
*<em>오류 원인이 첫번째 줄부터 대놓고 나와있는 모습
*</em>
**오류 로그를 제대로 확인도 하지 않고 멋대로 e를 할당하지 않아서 생긴 오류라고 치부하고 넘겼었고 import한번 해주니 문제 없이 출력 됐다</strong></p>
<p><strong>이전에도 수차례 오류 발생시에 오류 로그를 통한 문제 해결이 잘 안되었던 일이 있던 나머지 이런 일이 생긴것으로 판단 앞으로는 주의해야겠다고 생각했다</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Tailwind css]]></title>
            <link>https://velog.io/@flick_react1/Tailwind-css</link>
            <guid>https://velog.io/@flick_react1/Tailwind-css</guid>
            <pubDate>Wed, 06 Nov 2024 12:17:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>유틸리티 우선 (Utility-First)  CSS 프레임워크.</strong></p>
</blockquote>
<p>빠르고 쉽게 스타일링을 적용할 수 있는 클래스를 제공</p>
<p>기존의 CSS-in-JS 라이브러리인 Styled-Components보다 유연하고 직관적인 스타일링을 제공</p>
<h3 id="특징">특징</h3>
<ul>
<li><p>다양한 유틸리티 클래스를 제공, HTML 요소에 직접 클래스를 추가하는 방식으로 스타일링 가능.</p>
</li>
<li><p>불필요한 스타일을 제거하고, 필요한 부분만 스타일을 적용하는 방식으로 최적화되어 있음</p>
</li>
<li><p>React의 JSX 문법과 함께 사용할 수 있어, 스타일링이 간편</p>
</li>
</ul>
<h3 id="styled-components와의-비교">Styled-Components와의 비교</h3>
<ul>
<li><p><strong>Tailwind CSS</strong></p>
<ul>
<li><p>장점: 유틸리티 클래스 기반으로 간편한 사용, 성능 최적화</p>
</li>
<li><p>단점: 클래스 네임이 길어질 수 있음, 프로젝트 초기 설정 필요</p>
</li>
</ul>
</li>
<li><p><strong>Styled-Components</strong></p>
<ul>
<li>장점: JavaScript 파일 내에서 스타일링 가능, 동적 스타일링 지원, 컴포넌트 기반 설계</li>
<li>단점: 초기 설정 및 학습 곡선, 스타일링 시 성능 이슈 발생 가능</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[인증과 인가]]></title>
            <link>https://velog.io/@flick_react1/%EC%9D%B8%EC%A6%9D%EA%B3%BC-%EC%9D%B8%EA%B0%80</link>
            <guid>https://velog.io/@flick_react1/%EC%9D%B8%EC%A6%9D%EA%B3%BC-%EC%9D%B8%EA%B0%80</guid>
            <pubDate>Tue, 05 Nov 2024 11:39:21 GMT</pubDate>
            <description><![CDATA[<h2 id="인증authentication">인증(Authentication)</h2>
<blockquote>
<p>*<em>서비스를 이용하려는 유저가 등록된 회원인지 확인하는 절차
*</em></p>
</blockquote>
<h3 id="-로그인-과정">= 로그인 과정</h3>
<h2 id="인가authorization">인가(Authorization)</h2>
<blockquote>
<p><strong>인증을 받은 유저가 특정 리소스에 접근할 수 있는 권한이 있는지 확인하는 절차</strong></p>
</blockquote>
<h3 id="-로그인이-일어난-이후의-과정">= 로그인이 일어난 이후의 과정</h3>
<hr>
<h3 id="쿠키">쿠키</h3>
<blockquote>
<p>*<em>쿠키란 브라우저에 저장되는 작은 데이터 조각이며, key-value 형태로 저장된다
*</em></p>
</blockquote>
<h3 id="세션">세션</h3>
<blockquote>
<p><strong>세션이란 사용자와 서버 간의 연결이 활성화된 상태를 의미하는 개념 또는 인증이 유지되고 있는 상태</strong></p>
</blockquote>
<h3 id="토큰">토큰</h3>
<blockquote>
<p><strong>클라이언트에서 보관하는 암호화 또는 인코딩된 인증 정보.</strong></p>
</blockquote>
<ul>
<li>서버의 상태를 유지하지 않고도 클라이언트의 인증 상태를 확인이 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Throttling & Debouncing ]]></title>
            <link>https://velog.io/@flick_react1/Throttling-Debouncing</link>
            <guid>https://velog.io/@flick_react1/Throttling-Debouncing</guid>
            <pubDate>Mon, 04 Nov 2024 12:02:05 GMT</pubDate>
            <description><![CDATA[<h2 id="throttling">Throttling</h2>
<blockquote>
<p>짧은 시간 간격으로 연속해서 발생한 이벤트들을 일정시간 단위로 그룹화하여 처음 또는 마지막 이벤트 핸들러만 호출되도록 하는 것</p>
</blockquote>
<h3 id="주로-무한스크롤에서-사용">주로 무한스크롤에서 사용</h3>
<h2 id="debouncing">Debouncing</h2>
<blockquote>
<p>짧은 시간 간격으로 연속해서 이벤트가 발생하면 이벤트 핸들러를 호출하지 않다가 마지막 이벤트로부터 일정 시간이 경과한 후에 한 번만 호출하도록 하는 것</p>
</blockquote>
<h3 id="주로-입력값-실시간-검색-화면-resize-이벤트-등에서-사용">주로 입력값 실시간 검색, 화면 resize 이벤트 등에서 사용</h3>
<hr>
<h2 id="settimeout과-메모리-누수">setTimeout과 메모리 누수</h2>
<p><strong>메모리 누수 : 필요하지 않은 메모리를 계속 점유하고 있는 현상</strong></p>
<p>하나의 페이지에서 페이지 이동 없이 setTimeout을 동작시키고 타이머 함수가 종료될 때까지 기다린다면 <em><strong>메모리 누수 X</strong></em></p>
<p>리액트로 만든 SPA 웹사이트는 페이지 이동 시 컴포넌트가 언마운트 되는데, 페이지 이동 전에 setTimeout 으로 인해 타이머가 동작중인 상태에서 clearTimeout을 안해주고 페이지를 이동한다면, 컴포넌트는 언마운트 되었음에도 불구하고 타이머는 여전히 메모리를 차지하고 동작하기에 <em><strong>메모리 누수 O</strong></em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Zustand와 Immer의 결합]]></title>
            <link>https://velog.io/@flick_react1/Zustand%EC%99%80-Immer%EC%9D%98-%EA%B2%B0%ED%95%A9</link>
            <guid>https://velog.io/@flick_react1/Zustand%EC%99%80-Immer%EC%9D%98-%EA%B2%B0%ED%95%A9</guid>
            <pubDate>Tue, 29 Oct 2024 12:45:47 GMT</pubDate>
            <description><![CDATA[<p><strong>Zustand의 간편한 상태 업데이트 방식은 깊은 중첩 구조를 가지는 상태를 업데이트할 때 문제가 발생할 수 있다.</strong></p>
<p><strong>배열이나 객체의 중첩된 상태를 업데이트할 때 불변성을 유지하지 않으면 상태 반영이 제대로 이루어지지 않아, 예상치 못한 오류가 발생 가능</strong></p>
<ul>
<li><p><strong>Mutable 메서드 불변성 유지 X</strong>
  Mutable 메서드는 <strong>원본 데이터를 직접 수정하여 변경된 데이터를 반환</strong>합니다. 이 방법은 간단하지만, 상태 변화 추적이 어려워져 버그 발생 가능성이 높아집니다.</p>
</li>
<li><p><strong>Immutable 메서드 불변성 유지</strong>
  <strong>원본 데이터를 변경하지 않고, 수정된 새로운 데이터를 반환</strong>합니다. 이를 통해 불변성을 유지하며, 상태 관리가 쉬워지고 예측 가능한 코드 작성을 돕습니다.</p>
</li>
</ul>
<h3 id="immer">immer</h3>
<blockquote>
<p>Immer는 JavaScript에서 상태를 쉽게 변경할 수 있게 해주는 라이브러리</p>
</blockquote>
<p><strong>원본 데이터를 변경하지 않고도 마치 직접 수정하는 것처럼 코드를 작성할 수 있으며, Immer가 자동으로 불변성을 유지한 새 상태를 만들어줌.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Zustand]]></title>
            <link>https://velog.io/@flick_react1/Zustand</link>
            <guid>https://velog.io/@flick_react1/Zustand</guid>
            <pubDate>Mon, 28 Oct 2024 11:24:32 GMT</pubDate>
            <description><![CDATA[<h3 id="필요성">필요성</h3>
<p>기존의 상태관리 라이브러리인 <strong>Redux</strong>는 제공하는 기능과 연계된 미들웨어 등 매우 강력한 퍼포먼스를 자랑하지만, 설정과 사용법이 복잡함</p>
<p><strong>Zustand</strong>는 상태관리 본연의 기능에 집중하여 위와 같은 복잡성을 줄이고, 보다 간단하고 직관적인 상태관리 기능을 제공함</p>
<h3 id="특징">특징</h3>
<ul>
<li><p><strong>매우 간단한 API</strong>를 제공</p>
</li>
<li><p><strong>매우 적은 설정 코드</strong> 및 <strong>적용 코드를 이용하여 상태관리 기능을 구현</strong> 가능</p>
</li>
<li><p><strong>불필요한 리렌더링을 방지</strong>하는 등, <strong>성능 최적화</strong>가 잘 되어 있다</p>
</li>
<li><p><strong>Zustand</strong>는 상태가 변경될 때, 해당 상태를 <strong>구독</strong>(상태의 변경을 감지하고, 해당 변경에 반응하는 컴포넌트만 업데이트하는 메커니즘)<strong>하고 있는 컴포넌트만 리렌더링</strong>해요.</p>
</li>
<li><p><strong>상태의 일부가 변경되었을 때 그 상태를 사용하는 컴포넌트만 업데이트</strong>되므로, 애플리케이션 전체가 리렌더링되지 않는다</p>
</li>
</ul>
<h3 id="설치">설치</h3>
<p><code>yarn add zustand</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[axios GET, POST]]></title>
            <link>https://velog.io/@flick_react1/qxios-GET-POST</link>
            <guid>https://velog.io/@flick_react1/qxios-GET-POST</guid>
            <pubDate>Thu, 24 Oct 2024 13:06:33 GMT</pubDate>
            <description><![CDATA[<h2 id="axios">axios</h2>
<blockquote>
<p>node.js와 브라우저를 위한 Promise 기반 http 클라이언트(http를 이용해서 서버와 통신하기 위해 사용하는 패키지)</p>
</blockquote>
<h3 id="axios-설치">axios 설치</h3>
<p><code>yarn add axios</code></p>
<hr>
<h2 id="get">get</h2>
<blockquote>
<p>서버의 데이터를 조회할 때 사용</p>
</blockquote>
<h3 id="get-사용법">get 사용법</h3>
<p><code>axios.get(url[, config])</code></p>
<hr>
<h2 id="post">POST</h2>
<blockquote>
<p>서버에 데이터를 추가할 때 사용</p>
</blockquote>
<h3 id="보통-클라이언트의-데이터를-body형태로-서버에-보내고자-할-때-사용함">보통 클라이언트의 데이터를 body형태로 서버에 보내고자 할 때 사용함</h3>
<hr>
<h2 id="patch">PATCH</h2>
<blockquote>
<p>어떤 데이터를 수정하고자 서버에 요청을 보낼 때 사용하는 메서드</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[json-server]]></title>
            <link>https://velog.io/@flick_react1/json-server</link>
            <guid>https://velog.io/@flick_react1/json-server</guid>
            <pubDate>Wed, 23 Oct 2024 11:44:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>DB와 API 서버를 생성해주는 패키지</p>
</blockquote>
<p>*<em>프론트엔드에 집중해야 할 것이 많기에 직접 백엔드를 구축할 수 없어서 사용함
*</em></p>
<p><strong>또한 프론트엔드에서 백엔드가 하고 있는 작업을 기다리지 않고, 프론트엔드의 로직과 화면을 구현 할 수 있어 효율적으로 협업 가능</strong></p>
<h3 id="설치">설치</h3>
<p><code>yarn add json-server</code></p>
<h3 id="실행">실행</h3>
<p>*<em>리액트, json-server 둘다 실행. 리액트와는 별개로 따로 실행필요. *</em></p>
<p><strong>-  db.json 파일 생성</strong>
<strong>- 파일 내에 json 형식으로 내용 입력</strong>
<strong>- <code>yarn json-server db.json --port 지정숫자</code> 입력으로 실행</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[동기와 비동기의 처리 개념, Promise, HTTP]]></title>
            <link>https://velog.io/@flick_react1/%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%9D%98-%EC%B2%98%EB%A6%AC-%EA%B0%9C%EB%85%90-Promise-HTTP</link>
            <guid>https://velog.io/@flick_react1/%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%9D%98-%EC%B2%98%EB%A6%AC-%EA%B0%9C%EB%85%90-Promise-HTTP</guid>
            <pubDate>Tue, 22 Oct 2024 11:06:46 GMT</pubDate>
            <description><![CDATA[<h3 id="동기-처리">동기 처리</h3>
<blockquote>
<p>요청과 그에 따른 응답이 <strong>순차적</strong>으로 일어나는 방식</p>
</blockquote>
<ul>
<li><p>요청을 보내면 그 응답이 올 때까지 대기하고 그 다음 작업을 수행</p>
</li>
<li><p>일의 순서가 중요한 경우에 사용하는 방식</p>
</li>
<li><p>처리 순서는 보장됨. 다만 응답을 기다리는 동안 다른 작업 수행이 불가능하기에 비효율적 </p>
</li>
</ul>
<h3 id="비동기-처리">비동기 처리</h3>
<blockquote>
<p>요청과 그에 따른 응답이 <strong>비순차적</strong>으로 일어나는 방식</p>
</blockquote>
<ul>
<li><p>요청을 보내고 응답을 기다리지 않고, 다음 작업을 계속 수행</p>
</li>
<li><p>일의 순서가 중요하지 않은 경우 효율적인 비동기 처리를 사용</p>
</li>
</ul>
<hr>
<h3 id="promise">Promise</h3>
<blockquote>
<p>자바스크립트에서 <strong>비동기 작업의 완료 또는 실패를 처리</strong>하기 위해 사용되는 개념</p>
</blockquote>
<ul>
<li><p>Promise는 비동기 작업의 결과를 다루기 쉽게 하기 위해 만들어졌으며, 비동기 작업이 끝난 이후에 실행될 콜백을 등록할 수 있는 메서드를 제공</p>
</li>
<li><p>본래 콜백 함수를 중첩해서 사용하다 보면 코드가 복잡해지고 가독성이 떨어지는 문제가 발생함 </p>
</li>
<li><p>이를 해결하려고 나온것이 Promise</p>
</li>
</ul>
<hr>
<h3 id="http-hypertext-transfer-protocol">HTTP (HyperText Transfer Protocol)</h3>
<blockquote>
<p>웹 상에서 데이터를 주고받기 위한 프로토콜</p>
</blockquote>
<ul>
<li><p>클라이언트와 서버 간의 요청과 응답을 정의하며, 상태코드와 헤더를 포함한 다양한 요소를 가지고 있다</p>
</li>
<li><p>HTTP는 클라이언트가 요청을 보내면 서버가 응답을 반환하는 방식</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[console.log로 확인을 마쳤다면 바로 지우기]]></title>
            <link>https://velog.io/@flick_react1/console.log%EB%A1%9C-%ED%99%95%EC%9D%B8%EC%9D%84-%EB%A7%88%EC%B3%A4%EB%8B%A4%EB%A9%B4-%EB%B0%94%EB%A1%9C-%EC%A7%80%EC%9A%B0%EA%B8%B0</link>
            <guid>https://velog.io/@flick_react1/console.log%EB%A1%9C-%ED%99%95%EC%9D%B8%EC%9D%84-%EB%A7%88%EC%B3%A4%EB%8B%A4%EB%A9%B4-%EB%B0%94%EB%A1%9C-%EC%A7%80%EC%9A%B0%EA%B8%B0</guid>
            <pubDate>Mon, 21 Oct 2024 12:40:01 GMT</pubDate>
            <description><![CDATA[<pre><code>export default function PokemonDetail() {
  const navigate = useNavigate();
  const location = new URLSearchParams(useLocation().search);
  const pokemonId = parseInt(location.get(&quot;id&quot;));

  console.log(pokemonId);

  const selectedPokemon = MOCK_DATA.find(
    (pokemon) =&gt; pokemon.id === pokemon.id
  );

  console.log(&quot;selectedPokemon&quot;, selectedPokemon);</code></pre><p>**  위 코드는 MOCK_DATA의 id값과 페이지의 id값이 서로 일치하면 해당 정보를 불러오게 작동하는 코드이다 **</p>
<p>** 사전에 <code>console.log(pokemonId);</code> 을 작성하여 올바른 id를 불러오고 있는지 확인 후 진행하려는데**
 <img src="https://velog.velcdn.com/images/flick_react1/post/2f64a65f-a086-415e-b0cd-a2d5eb5d3b8b/image.png" alt=""></p>
<h3 id="id값-10번에-해당하는-페이지를-클릭했으나-mock_data값이-1인-정보가-가져와-지는-문제가-발생">id값 10번에 해당하는 페이지를 클릭했으나 MOCK_DATA값이 1인 정보가 가져와 지는 문제가 발생</h3>
<p><strong>작성한 코드를 다시 확인해본 결과 문제의 원인은 금방 찾았다</strong></p>
<pre><code>const selectedPokemon = MOCK_DATA.find(
    (pokemon) =&gt; pokemon.id === pokemon.id
  );</code></pre><p>**  해당 로직 부분의**</p>
<p>  <code>pokemon.id === pokemon.id</code> X
  <code>pokemon.id === pokemonId</code> O</p>
<p><strong>일치연산자를 사용하는 곳에서 오타가 발생했던 것</strong></p>
<p><strong>아마 작성시에 비슷한 단어이니 복사하고 수정을 거치지 않은 듯 한데, 원래라면 설치해두었던 확장앱인 에러렌즈가 작동하여</strong></p>
<p>  <img src="https://velog.velcdn.com/images/flick_react1/post/eab02ff1-68c3-4ab9-b4b2-bb03088a62e3/image.png" alt=""></p>
<p>** 해당 사진처럼 알려주어야 했으나 앞서 확인할 때 사용한 코드인 <code>console.log(pokemonId);</code> 로 인해 매치가 되어 에러렌즈가 감지하지 못하게 되었었다**</p>
<p>** 결론은 심각한 문제는 아니였지만 사용하지 않는 코드 특히 console.log를 이용한 코드는 바로 지워주거나 주석을 달아주는것이 좋다고 크게 느꼈었다**</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[단순 오류도 존재할 수 있는듯 하다]]></title>
            <link>https://velog.io/@flick_react1/%EB%8B%A8%EC%88%9C-%EB%B2%84%EA%B7%B8-%EC%A1%B4%EC%9E%AC</link>
            <guid>https://velog.io/@flick_react1/%EB%8B%A8%EC%88%9C-%EB%B2%84%EA%B7%B8-%EC%A1%B4%EC%9E%AC</guid>
            <pubDate>Fri, 18 Oct 2024 12:02:37 GMT</pubDate>
            <description><![CDATA[<pre><code>export default function PokemonCard({ pokemon, handleOnClick }) {
  return (
    &lt;Card
      onClick={() =&gt; {
        handleOnClick(pokemon);
        ~~~
      }}
    &gt;
      &lt;div&gt;{pokemon.korean_name}&lt;/div&gt;

      &lt;img src={pokemon.img_url} /&gt;

      &lt;div&gt;{pokemon.description}&lt;/div&gt;
    &lt;/Card&gt;
  );
}</code></pre><p><strong>참고 영상을 보며 과제 진행중 코드 작성 후 오류가 발생.</strong></p>
<blockquote>
<h3 id="handleonlclick-is-not-function"><em>handleOnlclick is not function</em></h3>
</blockquote>
<p><strong>참고하던 영상과 내가 작성하던 코드를 아무리 확인해도 다른 부분이 없다.</strong></p>
<p><strong>보통 이런 오류가 생긴다면 원인을 알고 해결하기 위해 검색등을 통해 해결하겠지만, 당장 앞에 보이는 영상에서는 문제없이 페이지가 작동하고 있기에 의구심이 듬.</strong></p>
<p><strong>코드를 작업 전으로 계속 돌릴까 생각하던 도중 코드를 저장하고 vscode를 재부팅하니 마치 아무일도 없었던 것 처럼 오류가 사라짐.</strong></p>
<p><strong>이런 경우는 처음이었기에 상당히 당황하였지만 앞으론 이런 시스템적 오류도 존재 할 수 있다는걸 깨달았다</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[대소문자 구분에 주의]]></title>
            <link>https://velog.io/@flick_react1/%EB%8C%80%EC%86%8C%EB%AC%B8%EC%9E%90-%EA%B5%AC%EB%B6%84%EC%97%90-%EC%A3%BC%EC%9D%98</link>
            <guid>https://velog.io/@flick_react1/%EB%8C%80%EC%86%8C%EB%AC%B8%EC%9E%90-%EA%B5%AC%EB%B6%84%EC%97%90-%EC%A3%BC%EC%9D%98</guid>
            <pubDate>Thu, 17 Oct 2024 11:32:48 GMT</pubDate>
            <description><![CDATA[<pre><code>// PokemonList.jsx

const PokemonList = ({ pokemonList, onAddPokemon }) =&gt; {
  return (
    &lt;ListContainer&gt;
      {pokemonList.map((pokemon) =&gt; (
        &lt;div&gt;{pokemon.korean_name}&lt;/div&gt;
        &lt;PokemonCard
          key={pokemon.id}
          pokemon={{}}
          onAdd={() =&gt; {}}
          isSelected={false}
        /&gt;
      ))}
    &lt;/ListContainer&gt;
  );
};</code></pre><pre><code>// Dex.jsx
export default function Dex() {
  const [selectedPokemon, setSelectedPokemon] = useState([]);

  return (
    &lt;DexContainer&gt;
      &lt;Dashboard selectedPokemon={selectedPokemon} /&gt;
      &lt;PokemonList PokemonList={MOCK_DATA} /&gt;
    &lt;/DexContainer&gt;
  );
}</code></pre><h3 id="pokemonlistjsx에서-pokemonlist-onaddpokemon을-props로-받아오고-있었는데-문제발생">PokemonList.jsx에서 pokemonList, onAddPokemon을 props로 받아오고 있었는데 문제발생</h3>
<p><strong>=&gt; 페이지가 안열림 확인해보니 Dex.jsx 파일의 pokemonList를 불러오는 부분이
PokemonList로 앞글자가 대문자로 작성됨 이로 인해 props가 일치하지 않게 되어 오류가 발생했었다</strong></p>
<p>*<em>하필 얼핏보면 구분이 힘든 ( p, P ) 차이 때문에 한번에 알아차리기 어려웠던것도 큼 *</em></p>
<p>&amp; ( i, I) 같은 경우에도 주의하자</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[useContext]]></title>
            <link>https://velog.io/@flick_react1/useContext</link>
            <guid>https://velog.io/@flick_react1/useContext</guid>
            <pubDate>Mon, 14 Oct 2024 12:11:49 GMT</pubDate>
            <description><![CDATA[<h3 id="props를-사용하면-컴포넌트들이-필요하지-않은-데이터를-전달하는-props-drilling으로-인해-불편함이-생김">props를 사용하면 컴포넌트들이 필요하지 않은 데이터를 전달하는 props drilling으로 인해 불편함이 생김</h3>
<blockquote>
<h4 id="위와-같은-현상을-방지하려면-props를-통해-데이터를-단계별로-전달하지-않는-usecontext를-사용하는-것이-좋다">위와 같은 현상을 방지하려면 props를 통해 데이터를 단계별로 전달하지 않는 useContext를 사용하는 것이 좋다</h4>
</blockquote>
<h3 id="기본-생성-방법">기본 생성 방법</h3>
<pre><code>import { createContext } from &quot;react&quot;;

const TodoContext = createContext();

export default TodoContext;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[props와 props추출]]></title>
            <link>https://velog.io/@flick_react1/props%EC%99%80-props%EC%B6%94%EC%B6%9C</link>
            <guid>https://velog.io/@flick_react1/props%EC%99%80-props%EC%B6%94%EC%B6%9C</guid>
            <pubDate>Fri, 11 Oct 2024 12:55:56 GMT</pubDate>
            <description><![CDATA[<h2 id="props">props</h2>
<blockquote>
<h3 id="부모-→-자식-데이터-전달-메커니즘--컴포넌트-간의-정보-교류-방법">부모 → 자식 데이터 전달 메커니즘 = 컴포넌트 간의 정보 교류 방법</h3>
</blockquote>
<ul>
<li><strong>props는 반드시 [부모] → [자식] 방향으로 흐름</strong></li>
<li><strong>읽기 전용으로 취급하며, 변경하지 않음</strong></li>
</ul>
<h3 id="구조분해할당을-이용해-props의-추출이-가능">구조분해할당을 이용해 props의 추출이 가능</h3>
<pre><code>function Todo({ title }){
    return &lt;div&gt;{title}&lt;/div&gt;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[React에서 아이콘 사용 - Lucide
]]></title>
            <link>https://velog.io/@flick_react1/React%EC%97%90%EC%84%9C-%EC%95%84%EC%9D%B4%EC%BD%98-%EC%82%AC%EC%9A%A9-Lucide</link>
            <guid>https://velog.io/@flick_react1/React%EC%97%90%EC%84%9C-%EC%95%84%EC%9D%B4%EC%BD%98-%EC%82%AC%EC%9A%A9-Lucide</guid>
            <pubDate>Thu, 10 Oct 2024 12:09:02 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/flick_react1/post/f09613c6-8f22-4e25-bfa7-488dab44e8d5/image.png" alt=""></p>
<h3 id="상단의-guide-클릭-후-좌측-nav에서-installation을-통해-lucide-사용을-위한-페이지로-이동">상단의 Guide 클릭 후 좌측 nav에서 installation을 통해 Lucide 사용을 위한 페이지로 이동</h3>
<p><img src="https://velog.velcdn.com/images/flick_react1/post/29c90161-5e3f-4ee1-b610-d1e52348fac7/image.png" alt=""></p>
<h3 id="react-항목에서-사용하고-있는-패키지를-선택-후-해당-명령어를-터미널에-입력하여-설치하기">React 항목에서 사용하고 있는 패키지를 선택 후 해당 명령어를 터미널에 입력하여 설치하기</h3>
<p><img src="https://velog.velcdn.com/images/flick_react1/post/b55f53f3-3076-411e-b1d2-323b1e7d24c3/image.png" alt=""></p>
<p><strong>아이콘 사용 메인 페이지에서 원하는 아이콘을 선택 혹은 검색</strong> </p>
<p><img src="https://velog.velcdn.com/images/flick_react1/post/0a268dbf-41ed-4595-a0b9-5dce4600badc/image.png" alt=""></p>
<h3 id="react를-선택-후-선택한-아이콘의-태그와-import항목을-복사-후-원하는-곳에서-붙여넣어-사용하기">React를 선택 후 선택한 아이콘의 태그와 import항목을 복사 후 원하는 곳에서 붙여넣어 사용하기</h3>
<p>*<em>해당 사진에서는 ellipsis-vertical 아이콘을 선택했고 해당 이름 그대로 태그를 직접 작성하고 사용해도 무방하나 기호의 여부를 잘 생각하고, 첫글자를 대문자로 선택하는 것을 잊으면 안됨 *</em></p>
<ul>
<li><code>&lt;ellipsis-vertical /&gt;</code> X</li>
<li><code>&lt;EllipsisVertical /&gt;</code>  O</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[컴포넌트 분리]]></title>
            <link>https://velog.io/@flick_react1/%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EB%B6%84%EB%A6%AC</link>
            <guid>https://velog.io/@flick_react1/%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EB%B6%84%EB%A6%AC</guid>
            <pubDate>Mon, 07 Oct 2024 13:08:22 GMT</pubDate>
            <description><![CDATA[<h3 id="컴포넌트-분리의-목적">컴포넌트 분리의 목적</h3>
<ul>
<li><h4 id="컴포넌트를-분리하면-각-컴포넌트가-독립적인-모듈처럼-작동하게-되어-코드의-재사용이-가능하고-유지보수가-쉬워짐">컴포넌트를 분리하면 각 컴포넌트가 독립적인 모듈처럼 작동하게 되어, 코드의 재사용이 가능하고 유지보수가 쉬워짐</h4>
</li>
<li><h4 id="하나에-파일에-모든-로직과-ui를-담는-것은-복잡성을-증가시킴-그렇기에-여러-컴포넌트로-나누면-각-컴포넌트의-역할이-명확해져-코드의-가독성이-향상">하나에 파일에 모든 로직과 UI를 담는 것은 복잡성을 증가시킴. 그렇기에 여러 컴포넌트로 나누면 각 컴포넌트의 역할이 명확해져 코드의 가독성이 향상.</h4>
</li>
</ul>
<h3 id="코드-재사용성-증가">코드 재사용성 증가</h3>
<ul>
<li><h4 id="버튼-입력-필드-등-자주-사용되는-ui요소를-독립된-컴포넌트로-분리하여-여러-곳에서-재사용할-수-있다">버튼, 입력 필드 등 자주 사용되는 UI요소를 독립된 컴포넌트로 분리하여 여러 곳에서 재사용할 수 있다</h4>
</li>
</ul>
<h3 id="분리-기준">분리 기준</h3>
<ul>
<li><h4 id="컴포넌트는-각자-하나의-책임만-가지기">컴포넌트는 각자 하나의 책임만 가지기</h4>
</li>
<li><h4 id="ui요소에-따라-분리하기-header-main-footer-등">UI요소에 따라 분리하기 (Header, Main, Footer 등)</h4>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[useEffect, useRef]]></title>
            <link>https://velog.io/@flick_react1/useEffect-useRef</link>
            <guid>https://velog.io/@flick_react1/useEffect-useRef</guid>
            <pubDate>Wed, 02 Oct 2024 11:50:33 GMT</pubDate>
            <description><![CDATA[<h2 id="useeffect">useEffect</h2>
<h3 id="컴포넌트가-화면에-보여지거나-사라졌을-때-무언가를-실행하고싶다면">컴포넌트가 화면에 보여지거나 사라졌을 때 무언가를 실행하고싶다면</h3>
<h3 id="-useeffect를-사용">=&gt; useEffect를 사용</h3>
<blockquote>
<p><strong>useEffect는 리액트 컴포넌트가 렌더링 된 이후마다 특정 작업을 수행하도록 설정할 수 있는 훅이다</strong></p>
</blockquote>
<p>App 컴포넌트가 화면에 렌더링 된 이후 useEffect 안에 있는 console.log가 실행</p>
<pre><code>import React, { useEffect } from &quot;react&quot;;

const App = () =&gt; {

  useEffect(() =&gt; {
        // 이 부분이 실행된다.
    console.log(&quot;hello useEffect&quot;);
  });

  return &lt;div&gt;Home&lt;/div&gt;;
}

export default App;</code></pre><hr>
<h2 id="useref">useRef</h2>
<h3 id="usestate와-더불어-특정-값을-저장하기-위해-사용하는-대표적인-hook">useState와 더불어 특정 값을 저장하기 위해 사용하는 대표적인 hook</h3>
<ul>
<li><h3 id="re-rendering과-상관없이-값을-기억하기-위해-사용되는-것이다">Re-rendering과 상관없이 값을 기억하기 위해 사용되는 것이다</h3>
</li>
<li><h3 id="state는-변경되면-렌더링이-되고-ref는-변경되면-렌더링이-안된다">state는 변경되면 렌더링이 되고, ref는 변경되면 렌더링이 안된다</h3>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[styled-components - 2 ( 조건부 스타일링 ), CSS Reset]]></title>
            <link>https://velog.io/@flick_react1/styled-components-2-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EC%8A%A4%ED%83%80%EC%9D%BC%EB%A7%81-CSS-Reset</link>
            <guid>https://velog.io/@flick_react1/styled-components-2-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EC%8A%A4%ED%83%80%EC%9D%BC%EB%A7%81-CSS-Reset</guid>
            <pubDate>Tue, 01 Oct 2024 11:57:31 GMT</pubDate>
            <description><![CDATA[<h2 id="조건부-스타일링">조건부 스타일링</h2>
<h3 id="스타일css-뼈대가-같은-요소-3가지에-각각-이름에-맞는-color값을-줘보기--조건부-사용">스타일css 뼈대가 같은 요소 3가지에 각각 이름에 맞는 color값을 줘보기 =&gt; 조건부 사용</h3>
<pre><code>const App = () =&gt; {
  return (
    &lt;&gt;
      &lt;StyledBox&gt;RedBox&lt;/StyledBox&gt;
      &lt;StyledBox&gt;BlueBox&lt;/StyledBox&gt;
      &lt;StyledBox&gt;GreenBox&lt;/StyledBox&gt;
    &lt;/&gt;
  );
};</code></pre><p><strong>border값의 color 속성을 각각 바꿔줄 것 이기에 함수 사용을 위한 <code>${ }</code> 안에 props 전달</strong></p>
<pre><code>const StyledBox = styled.div`
  border: 1px solid ${(props) =&gt; props.borderColor};
`;</code></pre><p>*<em>각 요소에 설정 값 지정 *</em></p>
<pre><code>const App = () =&gt; {
  return (
    &lt;&gt;
      &lt;StyledBox borderColor=&quot;red&quot;&gt;RedBox&lt;/StyledBox&gt;
      &lt;StyledBox borderColor=&quot;blue&quot;&gt;BlueBox&lt;/StyledBox&gt;
      &lt;StyledBox borderColor=&quot;green&quot;&gt;GreenBox&lt;/StyledBox&gt;
    &lt;/&gt;
  );
};</code></pre><h3 id="같은-코드가-반복되고있다--리팩토링-필요-switch문-map메서드를-이용하기">같은 코드가 반복되고있다 =&gt; 리팩토링 필요 (switch문, map메서드)를 이용하기</h3>
<h3 id="switch문">switch문</h3>
<pre><code>const BoxList = [&quot;red&quot;, &quot;blue&quot;, &quot;green&quot;];

const getBoxName = (color) =&gt; {
  switch (color) {
    case &quot;red&quot;:
      return &quot;RedBox&quot;;
    case &quot;blue&quot;:
      return &quot;BlueBox&quot;;
    case &quot;green&quot;:
      return &quot;GreenBox&quot;;
    default:
      return &quot;BlackBox&quot;;
  }
};</code></pre><h3 id="map">map</h3>
<pre><code>const App = () =&gt; {
  return (
    &lt;&gt;
      {BoxList.map((boxColor) =&gt; {
        return (
          &lt;StyledBox key={boxColor} borderColor={boxColor}&gt;
            {getBoxName(boxColor)}
          &lt;/StyledBox&gt;
        );
      })}
    &lt;/&gt;
  );
};</code></pre><h3 id="결과">결과</h3>
<p><img src="https://velog.velcdn.com/images/flick_react1/post/0319adaa-7dad-4f2c-9215-10eb63ed71e5/image.png" alt=""></p>
<hr>
<h2 id="css-reset">CSS Reset</h2>
<blockquote>
<p><strong>브라우저마다 기본으로 제공하는 스타일을 초기화하고 기본값을 주기 위해 하는 설정</strong></p>
</blockquote>
<ul>
<li><h3 id="css-reset은-cross-browsing을-위해-필요한-작업들-중-하나">CSS Reset은 cross browsing을 위해 필요한 작업들 중 하나</h3>
</li>
<li><p><em>cross browsing: 웹 페이지 제작 시 모든 브라우저에서 깨지지 않고 의도한 대로 올바르게 나오게 하는 작업을 말한다.*</em></p>
</li>
<li><h3 id="검색-등으로-reset으로-자주-사용하는-속성들을-복사하여-사용하기">검색 등으로 Reset으로 자주 사용하는 속성들을 복사하여 사용하기</h3>
</li>
<li><h3 id="보통-resetcss-파일을-따로-작성하여-import">보통 reset.css 파일을 따로 작성하여, import</h3>
</li>
</ul>
<hr>
<h2 id="간단한-예시">간단한 예시</h2>
<h3 id="chrome-브라우저기준-css-초기화를-하지-않은-상태">(Chrome 브라우저)기준 CSS 초기화를 하지 않은 상태</h3>
<p><img src="https://velog.velcdn.com/images/flick_react1/post/5e13e61f-b9af-4352-b527-0244d7e291ea/image.png" alt=""></p>
<h3 id="chrome-브라우저기준-css-초기화를-해준-상태">(Chrome 브라우저)기준 CSS 초기화를 해준 상태</h3>
<p><img src="https://velog.velcdn.com/images/flick_react1/post/acda92dc-ebce-4b90-b282-6ffa38b06216/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[styled-components - 1 (기본)]]></title>
            <link>https://velog.io/@flick_react1/styled-components</link>
            <guid>https://velog.io/@flick_react1/styled-components</guid>
            <pubDate>Mon, 30 Sep 2024 12:09:45 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>*<em>CSS in Js : 자바스크립트안에 CSS =&gt; 자바스크립트 코드로 CSS를 작성
*</em></p>
</blockquote>
<h3 id="장점">장점</h3>
<ul>
<li><strong>css-in-js를 사용해 기존의 import방식과는 달리 조건문, 변수 등 다양한 로직을 이용가능</strong></li>
</ul>
<h3 id="css-in-js-방식을-이용하려면-styled-components를-사용해야-함">css-in-js 방식을 이용하려면 styled-components를 사용해야 함</h3>
<hr>
<blockquote>
<p><strong>styled-components: 리액트에서 CSS-in-JS 방식으로 컴포넌트를 꾸밀수 있게 도와주는 패키지</strong></p>
</blockquote>
<hr>
<h3 id="사용법">사용법</h3>
<ul>
<li><p><strong>yarn으로 styled-components 설치</strong></p>
</li>
<li><p><strong>터미널에 <code>yarn add styled-components</code> 입력</strong></p>
</li>
<li><p><strong>설치 완료 후 아래의 형식을 지켜 사용</strong> </p>
<pre><code>const 변수명 = styled.적용하고싶은 html형식 `백틱안에 원하는 속성 기입`</code></pre></li>
</ul>
<p><strong>변수명 적용 시 파스칼 케이스 사용 =&gt; <code>PascalCase</code></strong></p>
<hr>
<h3 id="추가로-알아둘-내용">추가로 알아둘 내용</h3>
<p><strong>( 1 )</strong></p>
<pre><code>const styledBox = styled.div``;</code></pre><ul>
<li><p><strong>위 형식으로 styled-components 사용 시도 =&gt; 실패</strong></p>
</li>
<li><p><strong>변수명을 파스칼 케이스로 사용 안함</strong></p>
</li>
<li><p><strong>StyledBox로 변경 =&gt; 성공</strong></p>
</li>
</ul>
<p><strong>( 2 )</strong></p>
<ul>
<li><p><strong>css 속성 입력 시 자동완성 선택 할 때 tab키가 아닌 enter키 누르기를 습관화 하기</strong></p>
</li>
<li><p><strong>=&gt; tab을 눌러서 자동완성을 하면 : (colon) X</strong></p>
</li>
<li><p><strong>=&gt; enter를 눌러서 자동완성을 하면 : (colon) O</strong></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[삼항연산자 사용 리팩토링]]></title>
            <link>https://velog.io/@flick_react1/%EC%82%BC%ED%95%AD%EC%97%B0%EC%82%B0%EC%9E%90-%EC%82%AC%EC%9A%A9-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81</link>
            <guid>https://velog.io/@flick_react1/%EC%82%BC%ED%95%AD%EC%97%B0%EC%82%B0%EC%9E%90-%EC%82%AC%EC%9A%A9-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81</guid>
            <pubDate>Fri, 27 Sep 2024 12:45:23 GMT</pubDate>
            <description><![CDATA[<h2 id="삼항연산자">삼항연산자</h2>
<blockquote>
<h3 id="조건에-따라-값을-선택할-때-사용하는-연산자">조건에 따라 값을 선택할 때 사용하는 연산자</h3>
</blockquote>
<hr>
<pre><code>&lt;button onClick={() =&gt; toggleCompleted(todo.id)}&gt;완료&lt;/button&gt;</code></pre><ul>
<li>완료 문구만 적힌 텍스트에서 삼항연산자를 이용한 함수를 추가
  {todo.completed ? &quot;되돌리기&quot; : &quot;완료&quot;}</li>
</ul>
<pre><code>&lt;button onClick={() =&gt; toggleCompleted(todo.id)}&gt;{todo.completed ? &quot;되돌리기&quot; : &quot;완료&quot;}&lt;/button&gt;</code></pre><hr>
<pre><code>&lt;p&gt;</code></pre><ul>
<li>css추가, completed가 true면 line-through, false면 none. 취소선 추가</li>
</ul>
<pre><code>&lt;p style={{textDecoration: todo.completed ? &quot;line-through&quot; : &quot;none&quot;,}}&gt;</code></pre><hr>
<p>(+) 위 두 예시 모두 자바스크립트 문법이 들어가기에 { } 기입은 필수.</p>
]]></description>
        </item>
    </channel>
</rss>