<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>2_7r.log ( ᵕ·̮ᵕ )♩</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 04 Mar 2025 05:07:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>2_7r.log ( ᵕ·̮ᵕ )♩</title>
            <url>https://velog.velcdn.com/images/2_7r/profile/ad546aa5-8c14-4843-bf12-a4ebed5854b7/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 2_7r.log ( ᵕ·̮ᵕ )♩. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/2_7r" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[props에 대해 알아보자 !~!]]></title>
            <link>https://velog.io/@2_7r/prop</link>
            <guid>https://velog.io/@2_7r/prop</guid>
            <pubDate>Tue, 04 Mar 2025 05:07:52 GMT</pubDate>
            <description><![CDATA[<p>*<em>❗리액트에서는 재사용성과 효율적인 코드관리를 위해 컴포넌트를 분리하는 것이 중요하다❗
*</em></p>
<hr>
<p>나의 경우 .. 
사이드바를 내 페이지에서 사용할 수 있게 </p>
<p>(장비 목록 클릭 ➡️ 사이드바 열림이 되도록 해야하는 상황이였다!)</p>
<p>사이드바와 장비 목록의 파일은 다른데 ..........
이럴때는 어떻게 해야할까 ? </p>
<hr>
<p>바로
바로
...</p>
<p>⭐⭐⭐</p>
<h2 id="-props-">!! PROPs !!</h2>
<p>⭐⭐⭐</p>
<p>props은 <strong>부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하는 방식</strong>으로</p>
<p>리액트에서 컴포넌트 재사용에 있어 아주 중요한 개념이다 😊</p>
<hr>
<p>예시와 함께 살펴보면 &gt;&gt;</p>
<pre><code class="language-tsx">// 부모 컴포넌트
const ParentComponent = () =&gt; {
  const message = &quot;Hello, World!&quot;;
  return &lt;ChildComponent message={message} /&gt;;
};

// 자식 컴포넌트
const ChildComponent = (props: { message: string }) =&gt; {
  return &lt;h1&gt;{props.message}&lt;/h1&gt;;
};</code></pre>
<p>위 코드에서 ParentComponent는 
ChildComponent에 message라는 값을 props로 전달하고
자식 컴포넌트는 이를 props.message로 받아서 출력한다. </p>
<hr>
<p>이제 
특징을 살펴보며 
props에 대해  제대로 이해해보자 🐸</p>
<h2 id="특징">특징</h2>
<hr>
<h3 id="1-리액트의-단방향-데이터-흐름">1. 리액트의 단방향 데이터 흐름</h3>
<p>리액트는 <strong>단방향 데이터 흐름</strong>을 따른다!
데이터는 
<em>*<em>부모 -&gt; 자식 방향으로만! *</em></em>
전달할 수 있다는 것이다. </p>
<hr>
<p>(( 내 코드에서는 selectedEquipment를 
부모 컴포넌트( <em>EquipmentContainer</em> )에서 ➡️ 자식 컴포넌트( <em>CustomSidebar</em> )로 전달하고 있다. ))</p>
<hr>
<h3 id="2-props는-읽기전용-😮">2. Props는 읽기전용 😮</h3>
<p>props의 경우 데이터를 <strong>읽기 전용 데이터</strong>로 전달한다. </p>
<p>즉!
일반적으로 *<em>자식 컴포넌트에서는 내용을 수정할 수 없고❌ *</em>
부모가 전달한 값을 그대로~~ 사용해야한다. </p>
<p>(자식에서 변경하고싶다면 콜백함수를 사용해서 부모에게 변경 요청을 보내야한다. )</p>
<hr>
<h3 id="3-props가-변하면-리렌더링">3. props가 변하면 리렌더링</h3>
<p>props가 바뀌면 컴포넌트가 리렌더링 된다.</p>
<p>즉 , 
*<em>|⭐ 부모-데이터 ➡️ 자식 컴포넌트 ➡️ 자식컴포넌트 리렌더링 ⭐| 
*</em>인 구조다.</p>
<hr>
<p>내 코드를 살펴보면 ) </p>
<p> selectedEquipment는 <strong>데이터고</strong>, 이 값을 props로 전달한다. </p>
<p>① 부모에서 selectedEquipment가 변경될 때마다, 
② 자식 컴포넌트(<em>CustomSidebar</em>)도 변경된 데이터를 자동으로 받아서 
③ 리렌더링!</p>
<hr>
<h3 id="3-함수-전달">3. 함수 전달</h3>
<p>데이터를 전달할 뿐만 아니라, 
<strong>함수도 전달</strong>할 수 있다. </p>
<hr>
<p>예를 들어 !
부모 컴포넌트에서 자식에게 상태를 변경하는 함수를 전달하여, 
자식 컴포넌트에서 그 함수를 실행할 수 있습니다.</p>
<pre><code class="language-tsx">// 부모 컴포넌트
const ParentComponent = () =&gt; {
  const [count, setCount] = useState(0);

  const increment = () =&gt; {
    setCount(count + 1);
  };

  return &lt;ChildComponent increment={increment} /&gt;;
};

// 자식 컴포넌트
const ChildComponent = (props: { increment: () =&gt; void }) =&gt; {
  return &lt;button onClick={props.increment}&gt;Increment&lt;/button&gt;;
};</code></pre>
<p>위 코드에서 <code>increment</code> 함수는 부모에서 자식 컴포넌트로 전달되고, 
자식 컴포넌트에서 그 함수를 호출하여 부모의 상태를 변경할 수 있다.</p>
<hr>
<h2 id="🐸정리⭐">🐸정리⭐</h2>
<p>** Props는 | 컴포넌트 간의 데이터 공유를 가능하게 하는 데이터 전달의 핵심 !! | **
컴포넌트 간의 관계를 형성하고, 
.
.
특징으로는 
<strong>1. 단방향 데이터 흐름 **
*<em>2. 읽기 전용 *</em> _ 자식에서 내용 변경할 수 없음
상태 관리가 필요한 컴포넌트에서는 useState나 useReducer를 사용해야 !~!
**3. Props가 변경되면 해당 컴포넌트는 리렌더링</strong>
.
.
장점은 ! 
<strong>컴포넌트 재사용성 높여줌 👍</strong></p>
<hr>
<p>끝 🥰</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Set을 활용한 상태 관리 최적화로 '선택된 장비가 없습니다' 오류 해결하기]]></title>
            <link>https://velog.io/@2_7r/Set%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC-%EC%B5%9C%EC%A0%81%ED%99%94%EB%A1%9C-%EC%84%A0%ED%83%9D%EB%90%9C-%EC%9E%A5%EB%B9%84%EA%B0%80-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@2_7r/Set%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC-%EC%B5%9C%EC%A0%81%ED%99%94%EB%A1%9C-%EC%84%A0%ED%83%9D%EB%90%9C-%EC%9E%A5%EB%B9%84%EA%B0%80-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 21 Feb 2025 15:40:37 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/2_7r/post/76416253-a0af-46d8-8ce4-078097f840df/image.png" alt=""></p>
<p>이런 걸 만들고 싶었는데 문제가 생겼다 …</p>
<h1 id="⭐-오류">⭐ 오류:</h1>
<p>&quot;선택된 장비가 없습니다&quot; 문구가 사라지지 않는 오류‼️😢</p>
<h2 id="현상-"><strong>현상 :</strong></h2>
<p>아이템이 선택되어 대여 신청 버튼 api에 정보가 추가되었지만,
여전히 &quot;선택된 장비가 없습니다.&quot; 문구가 표시되는 혼란이 있었다. <strong>😮</strong></p>
<pre><code class="language-tsx">( selectedItems[category] || []).length &gt; 0 조건이 예상대로 동작하지 않음 )</code></pre>
<hr>
<h2 id="내가-생각했던-초기-원인은-🙆♀️">내가 생각했던 초기 원인은 ..🙆‍♀️</h2>
<p>그렇다면 selectedItems의 업데이트와 렌더링이 문제가 아닐지 의심되었는데..</p>
<ol>
<li><p>handleItemClick에 로그를 넣어도 console에 출력되지 않고..</p>
</li>
<li><p><code>selectedItems</code>들은  정상적으로 업데이트 되고 있었다.. </p>
<p> 그래서 느낌은 오는데 어떤 코드 때문인지 확신이 들지 않았다.</p>
</li>
</ol>
<h2 id="실제-원인은-">실제 원인은 ...!</h2>
<p>➔ <strong>상태 관리 방식</strong>의 문제!  </p>
<p>:  selectedItems 혹은 plan.equipment가 이전 상태를 참조하며 불변성이 유지되지 않고</p>
<p>-&gt; ‼️ 렌더링이 정상적으로 이루어지지 않은 것..‼️</p>
<hr>
<hr>
<h1 id="⭐-해결-방법-">⭐ 해결 방법 :</h1>
<ul>
<li><p>각 카테고리를 <strong>Set</strong>을 사용하여 중복을 처리👏</p>
</li>
<li><p>plan.equipment의 상태 업데이트를 <strong>불변성을</strong> 유지하면서 안전하게 변경한 것이 핵!심! 포인트 !</p>
<ul>
<li>selectedItems[category]로 선택된 장비들을 관리하면서 그 상태를 반영하여 렌더링</li>
</ul>
</li>
</ul>
<p>.
.
.</p>
<ul>
<li><p>!!! 중복 코드가 많을 때는 <strong>상태 관리</strong>가 복잡해지니까 코드가 깔끔하게 업데이트되고, </p>
</li>
<li><p><em>불필요한 렌더링을 방지*</em>하는 방향으로 개선하는 것이 중요하다고 한다.</p>
</li>
<li><p><strong>( + ) <code>Set</code>을 사용함</strong>으로써 불필요한 <strong>중복 코드</strong>와 <strong><code>map()</code> 호출</strong> 줄이기</p>
</li>
</ul>
<p>➕ <strong>불변성(Immutable State)</strong>
: React에서 상태를 직접 수정하는 것보다 ➡️ 상태를 새로 생성하는 것이 중요
    - 예를 들어, <code>setSelectedItems(prev =&gt; [...prev])</code>처럼 이전 상태를 변경하지 않고 새로운 상태를 반환하는 방식 <strong>😮</strong></p>
<hr>
<p>이 중에서도 </p>
<p>⭐<strong><code>Set&lt;string&gt;</code> 사용</strong>⭐이 </p>
<p>중점적인 문제 해결에 도움을 준것 같아서, 이 부분에 대해 자세히 알아보고자 한다. &gt;.&lt;</p>
<hr>
<h2 id="setstring의-개념과-사용👏👏"><code>Set&lt;string&gt;</code>의 개념과 사용👏👏</h2>
<h3 id="set---중복된-값을-허용하지-않는-데이터-구조"><strong>Set :</strong>  중복된 값을 허용하지 않는 데이터 구조</h3>
<ul>
<li>배열과 비슷한데 중복 허용안함</li>
<li>메서드 : 
아이템 추가 및 삭제 - add(<code>item</code>), delete(<code>item</code>) 
/ 값 확인(존재 여부) - has(<code>item</code>) / 모든 값 삭제 - clear()</li>
<li>순서 없음</li>
</ul>
<hr>
<p>우리가 주목해야할 포인트는 <strong>중복 허용하지 않음 !</strong> </p>
<p><strong>예를 들어 ))</strong></p>
<p>이미 선택된 장비를 추가하려고 할 때, <strong>Set</strong>은 그 아이템이 이미 포함되어 있으면 추가하지 않고, 이미 존재하지 않는 경우에만 추가하게 되어있다 . </p>
<p>즉 , </p>
<p><strong>Set이</strong> 중복된 값들이 생기지 않도록 자연스레 관리해주는 역할 ! 을 한다 😻</p>
<hr>
<h4 id="set의-장점은-🤗"><strong>set의 장점은 🤗</strong></h4>
<ul>
<li>중복 제거</li>
<li>효율적인 추가 및 삭제</li>
<li>불변성 유지 ( 원본 수정 대신 새롭게 복사된 개체로 값 업데이트 함 )</li>
</ul>
<p>이라고 할 수 있겠다 !</p>
<p>배열을 쓰는 것보다 <strong>직관적</strong>이고 <strong>간단</strong>하게 관리하며 <strong>불변성의 오류</strong>를 줄일 수 있다 굿~~</p>
<hr>
<h2 id="실제-코드-비교-🐱">실제 코드 비교 🐱</h2>
<h4 id="해결-전-코드">해결 전 코드:</h4>
<pre><code class="language-tsx">
const handleItemClick = (category: string, item: string) =&gt; {
  setSelectedItems((prev) =&gt; {
    const prevItems = prev[category] || [];
    const newItems = prevItems.includes(item)
      ? prevItems.filter((i) =&gt; i !== item) // 이미 선택된 경우 삭제
      : [...prevItems, item]; // 선택되지 않은 경우 추가
    return { ...prev, [category]: newItems };
  });

  // 강제 리렌더링 트리거
  setForceRender((prev) =&gt; prev + 1);
};
</code></pre>
<h4 id="해결-후-코드">해결 후 코드:</h4>
<pre><code class="language-tsx">

const handleItemClick = (category: string, item: string) =&gt; {
  setSelectedItems((prev) =&gt; {
    const updatedCategory = new Set(prev[category] || []); // **Set**으로 기존 아이템 복사
    updatedCategory.has(item) ? updatedCategory.delete(item) : updatedCategory.add(item); // 추가 및 삭제
    return { ...prev, [category]: updatedCategory }; // **불변성을** 지키며 상태 업데이트
  });

  // 강제 리렌더링 트리거
  setForceRender((prev) =&gt; prev + 1);
};
</code></pre>
<hr>
<h3 id="-불필요한-map-호출-제거">+ 불필요한 <code>map()</code> 호출 제거</h3>
<p>처음 코드에서는 <code>plans.map()</code>을 사용하여 모든 아이템을 순회했지만,</p>
<p>이렇게 해주면 중복된 아이템을 관리하는 데 <code>Set</code>만 사용하면 되어서 성능을 개선할 수 있다</p>
<hr>
<pre><code class="language-tsx">
// 중복 없이 아이템을 가져오는 방법
const uniqueItems = Array.from(
  new Set&lt;string&gt;(plans.flatMap((plan) =&gt; plan.equipment?.[category] || []))
);
</code></pre>
<p><strong>⭐ plans.map()을 사용한 방식에서는 매번 배열을 순회해야 했지만,
Set을 사용하면 
flatMap을 사용하여 중복 없이 한번에 처리할 수 있다. ⭐</strong></p>
<p>.</p>
<p>.</p>
<p>코드가 복잡해질때는 <strong>간결하고 명확</strong>한 것이 최고 … ⭐ ))</p>
<hr>
<h1 id="⭐-전체-문제-해결-완--뭐가-나아졌나면-">⭐ 전체 문제 해결 완 ! 뭐가 나아졌나면 ..</h1>
<ol>
<li><strong>중복 처리 최적화</strong>: <code>Set</code>을 사용하여 중복 아이템이 자동으로 관리되므로, 불필요한 상태 업데이트를 줄일 수 있었다.</li>
<li><strong>상태 관리의 불변성 유지</strong>: 상태를 직접 수정하지 않고, 복사본을 만들어서 업데이트하므로 React에서 예상치 못한 동작을 방지할 수 있었습니다.</li>
<li><strong>성능 최적화</strong>: <code>map()</code> 호출을 줄이고, <code>Set</code>을 사용하여 아이템을 효율적으로 관리함으로써 렌더링 성능을 개선할 수 있었습니다.👍</li>
</ol>
<hr>
<h1 id="⭐-새롭게-배운점">⭐ 새롭게 배운점</h1>
<h4 id="1-불변성의-중요성😉--setstate-공부-이후-또-다시-느낀---">1. 불변성의 중요성…😉 ( setState 공부 이후 또 다시 느낀 ..  )</h4>
<p>React에서 상태를 직접 변경하지 않고, 상태의 복사본을 만들어 변경하는 방식</p>
<p>렌더링에도 영향을 미쳐서 매우매우 중요한 것 같다</p>
<h4 id="2-set의-효율성">2. <code>Set</code>의 효율성</h4>
<p>중복 코드가 많아지고 상태 관리가 복잡해질 때, <code>Set의 사용은 중</code>복을 자동으로 제거해주니까 매우 효율적이다 .. !&gt;!&gt;</p>
<h4 id="3-상태-업데이트-최적화">3. 상태 업데이트 최적화</h4>
<p>상태 업데이트를 최적화하려면..!</p>
<p> 불필요한 <code>map()</code> 호출을 피하고, <code>Set</code>과 같은 자료구조를 사용해서 성능 개선 해보기 … !</p>
<hr>
<h1 id="끝-️">끝 ‼️</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[React의 상태관리와 useState]]></title>
            <link>https://velog.io/@2_7r/React%EC%9D%98-%EC%83%81%ED%83%9C%EA%B4%80%EB%A6%AC%EC%99%80-useState</link>
            <guid>https://velog.io/@2_7r/React%EC%9D%98-%EC%83%81%ED%83%9C%EA%B4%80%EB%A6%AC%EC%99%80-useState</guid>
            <pubDate>Fri, 14 Feb 2025 16:22:10 GMT</pubDate>
            <description><![CDATA[<h1 id="⭐state--상태--란-">⭐state ( 상태 ) 란 ?</h1>
<h3 id="-기억하고-관리해야하는-동적인-데이터-🐱">: <strong>기억하고 관리해야하는 동적인 데이터</strong> 🐱</h3>
<p>➡️<strong>버튼 클릭 횟수, 사용자가 입력한 텍스트, 서버에서 가져온 데이터</strong> 등은 모두 상태이다 !</p>
<hr>
<p>😮<strong>상태에 영향을 주는 것</strong> 
: 사용자 입력이나 서버의 응답, UI의 변화 등 .. </p>
<p>➕<strong>추가로 ... **
리액트는 **불변성</strong>을 기반으로 동작하기에,
기존 객체 수정 ( X ) 
<strong>새로운</strong> 객체를 생성해 교체👍 ( O ) 
-&gt; 이렇게 참조 주소를 비교하는 것은 렌더링 성능에 도움을 준다</p>
<p>((변경된 부분만 업데이트 → 브라우저에 최소한의 성능 비용으로 변경 반영!해주기 때문 )) </p>
<hr>
<hr>
<h1 id="⭐-상태-관리의-필요성">⭐ 상태 관리의 필요성</h1>
<p>React는 <strong>UI = f(상태)</strong>라는 개념을 기반으로 동작해서
즉, 상태가 변경되면 UI가 다시 렌더링된다.</p>
<hr>
<h4 id="올바르게-관리하지-않으면-어떤-문제가-발생할-수-있냐면-">올바르게 관리하지 않으면 어떤 문제가 발생할 수 있냐면 ..</h4>
<ol>
<li><p><strong>비일관성</strong>: UI와 내부 데이터가 일치하지 않는 😮 상황 발생</p>
</li>
<li><p>** 복잡성 증가**: 상태를 효율적으로 관리하지 않으면 코드가 복잡해짐 😢</p>
</li>
<li><p><strong>디버깅 어려움</strong>: 상태 변경 흐름을 이해하기 어려워짐 </p>
</li>
</ol>
<p>.
.</p>
<p>나의 경우에는 <strong>비일관성</strong> 문제를 겪어서 렌더링이 바로 되지 않는 문제가 생겼었다 </p>
<hr>
<p>하지만 !!! </p>
<h3 id="상태관리를-알아둔다면">상태관리를 알아둔다면</h3>
<h3 id="이런-문제를-만들지-않을-수-있다--👍🐱">이런 문제를 만들지 않을 수 있다 .. 👍🐱</h3>
<p>상태 관리를 신경쓰기만 해도  <strong>UI와 데이터의 일관성을 유지</strong>하고, 
<strong>코드의 가독성과 유지보수성 향상</strong>시킬 수 있으며, 
<strong>디버깅이나 확장</strong>도 쉬워질 것이다~</p>
<p>그러니까 알아둬야한다..</p>
<hr>
<p>우선 개념을 알아보도록 하자 </p>
<h1 id="⭐-react에서의-상태-관리---usestate">⭐ React에서의 상태 관리 - useState</h1>
<h3 id="usestate란"><strong>useState</strong>란?</h3>
<p>useState는 React에서 <strong>컴포넌트의 상태를 선언하고 관리</strong>할 수 있도록 도와주는 훅이다.</p>
<blockquote>
</blockquote>
<h4 id="📌-기본-개념">📌 기본 개념</h4>
<ol>
<li>상태 변수 선언</li>
<li>상태 변경 함수 제공</li>
</ol>
<p>앞서 말했듯이  리액트에서는 
<strong>상태 변경 -&gt; UI 리렌더링</strong>이 되기에 
쉽게 ~! 동적 UI 를 구현할 수 있다</p>
<blockquote>
</blockquote>
<h4 id="📌-기본-사용법">📌 기본 사용법</h4>
<p>const [state, setState] = useState(initialValue);</p>
<blockquote>
</blockquote>
<ul>
<li>state : 현재 상태 값</li>
<li>setState : 상태를 변경하는 함수</li>
<li>initialValue : 상태의 초기값 (숫자, 문자열, 배열, 객체 등이 가능함!) </li>
</ul>
<p>코드를 살펴보며 설명해보면</p>
<pre><code class="language-jsx">import React, { useState } from &#39;react&#39;;

function Counter() {
  //⭐ 상태 변수 count, 상태 변경 함수 setCount
  const [count, setCount] = useState(0); 
//⭐➡️ count 초기값 : 0 -&gt; 처음 렌더링때만 적용 !!

  //⭐버튼 클릭 시 상태 변경 ➡️ 클릭시 1 증가
  const handleIncrement = () =&gt; {
    setCount(count + 1); //⭐ 상태 변경 예약 &amp; 렌더링 요청, 상태 변경시 리렌더링 ‼️
  };

  return (
    &lt;div&gt;
      &lt;p&gt; 현재 카운트: {count} &lt;/p&gt;
      &lt;button onClick={handleIncrement}&gt;+1 증가&lt;/button&gt;
    &lt;/div&gt;
  );
}

export default Counter;</code></pre>
<p>여기서 중요한 건 
리액트는 <strong>이전 상태와 새로운 상태의 참조를 비교</strong>해서 렌더링 여부를 결정한다는 것이다. 
.
.
그렇기에 
setCount만 설정하면 
상태 변경이 <strong>예약</strong>된 상태이고 
위의 코드의 경우 onClick으로 상태가 변경되어야‼️
<strong>리렌더링</strong>이 이루어진다 🙆‍♀️</p>
<hr>
<p>개념을 알았다면
좀 더 본격적으로 ☺️
본격적인 특징과 동작 원리를 공부해보자 ⭐</p>
<hr>
<h1 id="⭐-usestate의-특징과-동작-원리">⭐ <strong>useState</strong>의 특징과 동작 원리</h1>
<p>_</p>
<h2 id="1-비동기적-상태-업데이트">1. 비동기적 상태 업데이트</h2>
<p>바로 직전에 설명했던 것이다 !~)) </p>
<p>React는 성능 최적화를 위해 상태 업데이트를 <strong>비동기적</strong>으로 처리한다. </p>
<p>setState를 호출한 직후에는 변경된 값이 바로 반영되지 않고 ❌</p>
<p><strong>Batch Processing(일괄 처리)</strong>를 통해 여러 상태 변경을 묶어서 처리한다.</p>
<pre><code class="language-jsx">
const [count, setCount] = useState(0);

const handleClick = () =&gt; {
  setCount(count + 1);
  console.log(count); // 예상: 1 / 실제: 0 (이전 값 출력)
};</code></pre>
<p>이 코드의 문제는 무엇일까 ~?</p>
<p>.
.</p>
<p><strong>정답</strong> : 상태 업데이트를 예약만 하고 바로 실행하지 않기에 문제가 생긴다!
렌더링 시점의 count를 참조하기 때문에 항상 이전 값이 사용되고 있다 😮</p>
<hr>
<p>어떻게 수정해주면 좋을까 ? 
.
.</p>
<pre><code class="language-jsx">const handleClick = () =&gt; {
  setCount(prevCount =&gt; prevCount + 1);
  console.log(count); // 예상: 1 / 실제: 여전히 이전 값이지만 내부 로직은 올바르게 동작
};</code></pre>
<p>➡️ 이렇게 <strong>함수형 업데이트</strong>를 활용해서 수정해줄 수 있다 ! 🐱</p>
<p>= 이러면 prevCount를 통해 최신 상태가 유지되고,
다음 렌더링 시에는 올바른 값이 화면에 표시된다. ☺️</p>
<hr>
<h2 id="2-객체-상태-관리와-불변성">2. 객체 상태 관리와 불변성</h2>
<p>React는 <strong>불변성 원칙</strong>을 따르기 때문에 <strong>기존 객체를 직접 수정하면 안된다</strong></p>
<p>➡️ 
기존 객체를 수정하면 
<strong>참조 주소가 동일</strong>해서 변경이 없다고 판단하여 
렌더링이 일어나지 않는다
.
.</p>
<blockquote>
</blockquote>
<ul>
<li>기존 객체 수정 → 리렌더링  ❌<pre><code class="language-jsx">const [user, setUser] = useState({ name: &#39;Lee&#39;, age: 24 });
&gt;
const changeName = () =&gt; {
user.name = &#39;Kim&#39;;
setUser(user); // 참조 주소 동일 → 리렌더링 안 됨
};</code></pre>
</li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>새로운 객체 → 리렌더링 😉<pre><code class="language-jsx">const changeName = () =&gt; {
setUser(prevUser =&gt; ({ ...prevUser, name: &#39;Kim&#39; }));
};</code></pre>
</li>
</ul>
<hr>
<h2 id="3-독립적-상태-관리-💖">3. 독립적 상태 관리 💖</h2>
<p>React에서는 각 상태가 <strong>독립적</strong>으로 관리된다.</p>
<p>🐱 관련된 상태는 객체 형태로 묶어서 관리 가능하다 → 코드 가독성 올라감 😮</p>
<pre><code class="language-jsx">const [user, setUser] = useState({ name: &#39;&#39;, age: 0 });

const updateName = (newName) =&gt; {
  setUser(prevUser =&gt; ({ ...prevUser, name: newName }));
};</code></pre>
<hr>
<h1 id="정리해보면-">정리해보면 ~</h1>
<ul>
<li><p><strong>상태(state)</strong>는 React에서 동적 데이터를 관리하고
변경 시 UI가 자동으로 리렌더링 🔃</p>
</li>
<li><p><strong>불변성 유지</strong> 중요 ⭐
객체 수정 시 반드시 <strong>새로운 객체</strong>를 생성해야 리렌더링 작동</p>
</li>
<li><p>setState는 <strong>비동기적</strong> ☺️‼️
최신 상태를 보장을 위해서 함수형 업데이트를 사용해야 함</p>
</li>
</ul>
<p>.
.
.
끝 ✌️</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[토스를 통해 알아보는 ux/ui 원리 💸🙌]]></title>
            <link>https://velog.io/@2_7r/%ED%86%A0%EC%8A%A4%EB%A5%BC-%ED%86%B5%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-uxui-%EC%9B%90%EB%A6%AC</link>
            <guid>https://velog.io/@2_7r/%ED%86%A0%EC%8A%A4%EB%A5%BC-%ED%86%B5%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-uxui-%EC%9B%90%EB%A6%AC</guid>
            <pubDate>Fri, 31 Jan 2025 14:57:39 GMT</pubDate>
            <description><![CDATA[<h2 id="토스는-어딘가-다르다--왜지-"><strong>토스는 어딘가 다르다 .. 왜지 ?</strong></h2>
<h3 id="--계속-찾아오게-되는-ux--ui">- 계속 찾아오게 되는 ux / ui</h3>
<ul>
<li>직관적인 단어 사용</li>
<li>친근한 어투 + 이름 불러줌</li>
</ul>
<p>  : ㅇㅇ님을 위해 준비했어요 (이벤트 광고임), ㅇㅇ님을 위한 서비스 (서비스 랭킹, 이것도 사실상 광고임) → 그렇지만 ..~~ 소속감을 주고 앱에 대한 좋은 경험을 주는 말투임</p>
<ul>
<li>로딩, 페이지 전환 시 애니메이션 사용 및 멘트 : 기다리는 동안 지루하지 않음 (<strong>도허티 임계값</strong>)</li>
</ul>
<h3 id="--토스의-이벤트는-왜-참여하게-될까---ux-">- <strong>토스의 이벤트는 왜 참여하게 될까 ? ( UX )</strong></h3>
<ol>
<li><p><strong>클릭하기 좋은</strong> 하단의 위치에 이벤트가 있음 </p>
</li>
<li><p>제일 처음 <strong>눈길이 가는</strong> 상단에 이벤트 배너가 있음 , 배너의 아이콘이 *<em>움직임 *</em>(클릭 유도)</p>
<p> : 이렇게 혹해서 들어가면 …. 머무는 시간에 따라 포인트를 지급하는 이벤트가 있는데 이러면 처음에 토스 앱에 들어왔던 목적은 까먹고 계속 머무르게 된다 ..  . …  시선이 가는 위치에 시간이 뜸 </p>
</li>
<li><p><strong>공유</strong>하는 미션, 이벤트 : 한 번씩 토스 이벤트 링크 친구한테 받아본 적 있을 것이다….ㅇ.. !</p>
</li>
<li><p><strong>친근한 대화체</strong>
<img src="https://velog.velcdn.com/images/2_7r/post/d2364a47-7088-4102-87d5-71850b070e70/image.png" alt=""></p>
</li>
</ol>
<hr>
<h2 id="토스의-ui-에-대해-알아보자">토스의 ui 에 대해 알아보자</h2>
<h3 id="색상-간소화"><strong>색상 간소화</strong></h3>
<ul>
<li><p>파랑 <strong>한가지의 포인트 컬러</strong> 
( 여기어때는 빨강/파랑, 당근은 초록/주황의 포인트가 있었는데 여기는 파랑뿐이다 )</p>
<p> → 그럼에도 눈이 지루하지 않은 이유는 3D <strong>아이콘의 색</strong>이 다양해서인듯 하다 😺👍</p>
</li>
<li><p>아주 가끔 다른 색을 쓰기도 하는데 .. (대부분 광고를 위함, 또는 업데이트 알림 )</p>
</li>
</ul>
<p>   : 이게 오히려 시선을 끄는 효과가 있다❗ ( <strong>폰 레스토프 효과</strong> ) </p>
<p><img src="https://velog.velcdn.com/images/2_7r/post/e70d8ab1-7fe9-40f8-b01f-771eff309f85/image.png" alt=""></p>
<h3 id="깔끔하고-간결한-디자인"><strong>깔끔하고 간결한 디자인</strong></h3>
<ul>
<li>기존 은행 앱과 유사한 UI : <strong>제이콥의 법칙</strong></li>
<li><strong>시각적 명확성</strong> : 직관적인 아이콘 디자인</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2_7r/post/85a08f20-2f50-427c-8604-84c3c5d41650/image.png" alt=""></p>
<ul>
<li><p><strong>메인화면의 적은 카테고리</strong> 
: 하단 네비게이션 바를 통해 페이지 안에 탭,
탭 안에 페이지 연결 등으로 연결되도록 하여 복잡하고 넓은 구조를 깔끔하게 정리해뒀다
.
.
.
(사실상 따로 햄버거 버튼을 안 열어도 웬만한 기능은 <strong>하단 네비게이션 바</strong>의 네 개의 아이콘을 통해 들어갈 수 있을 것 같다)</p>
</li>
<li><p><strong>시각적 계층 구조</strong></p>
<p>  : 컨테이너의 배경색을 다르게 하고 <strong>여백</strong>을 두어 각 요소를 <strong>구분</strong>하여 가독성을 높였다</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2_7r/post/256d8371-7a4c-44e5-82e6-97399b613e5e/image.png" alt=""></p>
<ul>
<li><strong>[모든 서비스]의 텍스트 정렬</strong></li>
</ul>
<p>   : 제목 - 설명을 space between 느낌으로 정렬한 게 좋다. 눈에 더 잘 들어오는 듯 🥰!!
   <img src="https://velog.velcdn.com/images/2_7r/post/f8f96df9-9cc8-43f2-b9f5-65d0bd09d174/image.png" alt=""></p>
<ul>
<li><p><strong>우선순위 강조</strong></p>
<p>  : 중요한 작업은 시각적으로 강조하여 사용자에게 우선순위 인식 유도</p>
</li>
</ul>
<hr>
<h2 id="🤗-이건-어떨까-">🤗 이건 어떨까 ?</h2>
<ul>
<li><strong>가독성 개선</strong></li>
</ul>
<p><img src="https://velog.velcdn.com/images/2_7r/post/69870d4b-b777-4fee-9191-946a827231db/image.png" alt="">
    - 첫 화면에 볼드 사용 줄이기 ( -&gt; 폰트 크기 변화로 대체 )
    - 쉬운 홈 기능 추가하기 ( 우리 은행 앱 참고..😺 ) 
    : 이벤트 내용 숨기고 은행 기능만 바로 사용할 수 있게 하면 어떨지 ~</p>
<ul>
<li><strong>첫 화면 : 우선순위에 맞게 위치 변경</strong><ul>
<li>송금은 중요한 업무니까 → 파란색 
결제도 자주 사용하니까 → 바디 부분으로 위치 변경하는것두 좋을듯</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[당근마켓을 통해 알아보는 UI 원리🥕]]></title>
            <link>https://velog.io/@2_7r/%EB%8B%B9%EA%B7%BC%EB%A7%88%EC%BC%93-UI-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@2_7r/%EB%8B%B9%EA%B7%BC%EB%A7%88%EC%BC%93-UI-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Fri, 31 Jan 2025 14:49:00 GMT</pubDate>
            <description><![CDATA[<h2 id="디자인-및-색상-사용--통일감-있는-ui"><strong>디자인 및 색상 사용 :</strong> 통일감 있는 UI</h2>
<h3 id="👌-심미적-사용성-효과-게슈탈트-유사성의-원리">👌 심미적 사용성 효과, 게슈탈트 유사성의 원리</h3>
<ul>
<li>라운드 통일 ( 카드, 버튼 등 )</li>
<li>라운드 → 부드럽고 깔끔한 분위기</li>
<li>검정 / 화이트 기반의 심플한 디자인, 브랜드의 이름🥕 떠올리는 주황/초록의 포인트 컬러 사용</li>
</ul>
<p>✨</p>
<ul>
<li><strong>심미적 사용성 효과</strong> 
: 시각적으로 깔끔하고 조화로운 디자인→ 사용자의 만족도를 높이고 신뢰도 향상 시킴</li>
<li><strong>게슈탈트 유사성의 원리</strong> 
: 유사한 형태와 색상의 요소를 배치해서 시각적 그룹화 유도함</li>
</ul>
<hr>
<h2 id="레이아웃-및-내비게이션-구조"><strong>레이아웃 및 내비게이션 구조</strong></h2>
<h3 id="👌-제이콥의-법칙-히크의-법칙-게슈탈트-원리">👌 제이콥의 법칙, 히크의 법칙, 게슈탈트 원리</h3>
<ul>
<li><strong>기본 구조:</strong> 상단바 - 바디 - 하단 네비게이션 바</li>
<li>하단 네비게이션바 아이콘에 익숙한 디자인을 사용 → <strong>쉽게 이해 가능</strong></li>
<li>햄버거 메뉴에 부가 기능을 숨겨 <strong>메인 화면의 복잡성을 최소화</strong></li>
<li><strong>특정 항목(3개_[동네거래])만</strong> 메인에 표시 🥰</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2_7r/post/9759a104-9ad9-49cc-9606-1ddfd2ee0337/image.png" alt=""></p>
<p>✨</p>
<ul>
<li><strong>제이콥의 법칙</strong>
: 사용자는 다른 앱에서 경험한 인터페이스와 유사한 디자인을 선호</li>
<li><strong>히크의 법칙</strong> 
:메인 화면에서는 ‘동네거래’ 관련 핵심 기능만 노출하여 선택지를 최소화 </li>
<li><blockquote>
<p>사용자의 의사결정 부담 감소 🤭</p>
</blockquote>
</li>
<li><strong>게슈탈트 원리</strong> 
: 상단바와 본문, 네비게이션 바 사이의 여백을 활용해 기능별 구분을 명확히 함</li>
</ul>
<hr>
<h2 id="카드형-레이아웃-및-정보-구성"><strong>카드형 레이아웃 및 정보 구성</strong></h2>
<h3 id="👌-폰-레스토프-효과-게슈탈트-원리">👌 폰 레스토프 효과, 게슈탈트 원리</h3>
<ul>
<li><strong>정보구성</strong> : 가격(+예약/완료) → 제품명 → 장소 및 업로드 시간 → 채팅 &amp; 찜 개수 순서로 강조<ul>
<li>색상 차별, 글씨 굵기를 활용해 정보의 위계를 나타냄</li>
</ul>
</li>
<li><strong>카드형</strong> 디자인 → 직관적 정보 전달</li>
</ul>
<p><strong>✨</strong></p>
<ul>
<li><strong>폰 레스토프 효과</strong> 
: 주황색으로 강조 (가격 정보, 주요 버튼 등)</li>
<li><strong>게슈탈트 원리</strong><br>: 중요한 정보(가격, 상태)를 더 강조 ❗</li>
</ul>
<hr>
<h2 id="로딩-및-시스템-반응성"><strong>로딩 및 시스템 반응성</strong></h2>
<h3 id="👌도허티-임계값">👌<strong>도허티 임계값</strong></h3>
<ul>
<li><strong>로딩 중</strong> 애니메이션과 스켈레톤 스크린 표시</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2_7r/post/868bddbb-0a01-4867-b9aa-8dd08db8723a/image.png" alt=""></p>
<p>✨</p>
<ul>
<li><strong>도허티 임계값</strong> 
: 시스템 반응 시간이 400ms 이하일 경우 사용자가 더 유쾌하게 느끼도록 애니메이션과 시각적 피드백 제공</li>
</ul>
<hr>
<h2 id="글쓰기-상품-등록">글쓰기 (상품 등록)</h2>
<h3 id="👌-폰-레스토프-효과-피츠의-법칙">👌 <strong>폰 레스토프 효과,</strong> 피츠의 법칙</h3>
<ul>
<li>[글쓰기] 버튼을 주황색으로 <strong>강조</strong></li>
<li>[메인] - [글쓰기] 창에서 바로 [동네 거래] <strong>네 가지 카테고리</strong> 선택 가능 : 사용자 니즈 파악</li>
<li>글쓰기 버튼, 작성 완료 버튼은 하단에 배치하여 <strong>쉽게 터치</strong>할 수 있게 함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2_7r/post/75d8d67c-c11f-4a72-8e61-e01fcaac125c/image.png" alt=""></p>
<p><strong>✨</strong></p>
<ul>
<li><strong>폰 레스토프 효과</strong> 
: 주황색으로 강조 (글쓰기)</li>
<li><strong>피츠의 법칙</strong> 
: 버튼을 사용자의 손이 쉽게 닿는 위치에 배치 : 접근성과 사용성 향상</li>
</ul>
<hr>
<h2 id="🐹-이건-어떨까-">🐹 이건 어떨까 ?</h2>
<ul>
<li><p><strong>하단 네비게이션 바 텍스트 지우기</strong></p>
<p>  : 아이콘 만으로 기능을 충분히 인지할 수 있을 것 같아 텍스트를 지우고 깔끔하게 정리해보는 건 어떨까 ~</p>
</li>
<li><p><strong>대체로 탭 전환 대신 페이지 전환을 사용한 부분 → 탭 전환 사용 비율 높이기</strong>
  : 로딩시간이 길어지는 문제가 생김 
  → 일부는 탭으로 정리해도 좋을 듯하다</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[여기어때를 통해 UI 원칙 살펴보기 📢🥰]]></title>
            <link>https://velog.io/@2_7r/%EC%97%AC%EA%B8%B0%EC%96%B4%EB%95%8C%EB%A5%BC-%ED%86%B5%ED%95%B4-UI-%EC%9B%90%EC%B9%99-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@2_7r/%EC%97%AC%EA%B8%B0%EC%96%B4%EB%95%8C%EB%A5%BC-%ED%86%B5%ED%95%B4-UI-%EC%9B%90%EC%B9%99-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Fri, 31 Jan 2025 14:38:58 GMT</pubDate>
            <description><![CDATA[<h3 id="1-피츠의-법칙">1. 피츠의 법칙</h3>
<ul>
<li><strong>하단 네비게이션 바</strong> : [검색] 아이콘이 있어서 접근이 편함</li>
<li><strong>캘린더</strong> : 무한 스크롤로 클릭하는 것보다 사용하기 편하도록 구성함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2_7r/post/ae83e688-2898-4a8e-baac-58a46055eb2f/image.png" alt=""></p>
<ul>
<li><strong>카드 카테고리 화</strong> : 카드 자체를 카테고리로 사용하여 접근이 쉬움 👌</li>
</ul>
<hr>
<h3 id="2-폰-레스토프-효과">2. 폰 레스토프 효과</h3>
<ul>
<li><strong>빨강📍</strong>을 브랜드 색으로 사용해 요소들을 강조함</li>
<li><strong>파랑</strong>으로 빨강보다 중요한 요소들을 추가적인 강조 ( 확인, 결제, 적용 등 )</li>
</ul>
<hr>
<h3 id="3-히크의-법칙">3. 히크의 법칙</h3>
<ul>
<li><strong>검색 내 탭 전환</strong> : [국내숙소, 해외숙소, 항공, 레저티켓]을 따로 페이지를 열 필요 없이 탭으로 전환해 바꿔서 검색할 수 있도록 구성해 사용자의 움직임을 편하게 함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2_7r/post/80cf0883-3010-4258-b44c-c6e128309718/image.png" alt=""></p>
<ul>
<li><strong>날짜/인원 선택 탭 전환</strong> :  사용자가 쉽게 선택할 수 있음</li>
</ul>
<hr>
<h3 id="4-게슈탈트-원리">4. 게슈탈트 원리</h3>
<ul>
<li><strong>카드 디자인</strong> : 클릭하기 쉬운 적당한 카드의 크기와 이미지로 이해가 쉬움( 홈 &amp; 빌라  페이지 )</li>
<li><strong>카드 카테고리 화</strong> : 카드를 카테고리화하여 필요한 정보만 간결하게 담아둠</li>
</ul>
<hr>
<h3 id="5-기타">5. 기타</h3>
<ul>
<li><strong>색상, 폰트 크기와 굵기</strong>로 중요도를 잘 나눠줘서 눈이 편안함</li>
<li><strong>여백</strong>도 다른 앱에 비해 넓은 느낌임 😺</li>
<li><strong>큐레이팅</strong>이 많으며 <strong>짧고 직관</strong>적인 단어들을 사용하여 클릭하고 싶어짐.</li>
</ul>
<hr>
<h2 id="🤭-이건-어떨까-">🤭 이건 어떨까 ?</h2>
<ul>
<li><p><strong>카테고리 항목 개수 줄이기 _ 밀러의 법칙</strong>
  : 사람은 단기 기억에서 평균 7±2개의 항목만 기억 가능하다고 함 </p>
<pre><code>첫 화면에서 12개의 종류가 나오는데 더 그룹화 하면 좋을 듯함!</code></pre></li>
<li><p><strong>카드 크기 키우기 _ 피츠의 법칙</strong>
  : 홈&amp;빌라 페이지 외의 다른 페이지의 카드는 너무 작음</p>
<pre><code>피츠의 법칙에 따라 손가락으로 쉽게 누를 수 있는 크기로 조정해야 함</code></pre></li>
<li><p><strong>최저가 보장 정보 강조 (해외숙소 페이지)</strong>
  : 최저가 보장과 인기 여행지란이 구분이 잘 안 됨. ‘최저가 보장 인기 여행지’를 좀 더 키우고 강조해야 사용자가 더 쉽게 인지할 수 있음. 리조트 이름은 볼드체로 빼면 좋을 듯<del>~
~</del>→ 당근의 중고거래 상품 ui 처럼 <del>!</del></p>
</li>
<li><p><strong>일관성 만들기</strong></p>
<ul>
<li>타이틀 폰트, 배치 통일
<img src="https://velog.velcdn.com/images/2_7r/post/05957e2d-f48c-476d-b0ac-26ccc4b4e7bb/image.png" alt="">
<img src="https://velog.velcdn.com/images/2_7r/post/bf79429d-5fa2-434a-9133-c544f0d5daba/image.png" alt=""></li>
</ul>
</li>
</ul>
<p>: 홈 &amp; 빌라 페이지만 <strong>폰트</strong>가 다르며, 타이틀이 <strong>상단 바에 위치하지 않음</strong> 일관된 디자인 원칙을 따라 통일감 있는 UI를 제공하는 것이 좋음</p>
<ul>
<li><p><strong>카테고리 아이콘 디자인 통일</strong></p>
<p>  <img src="https://velog.velcdn.com/images/2_7r/post/16705d32-10eb-409b-93fa-2040c2bede74/image.png" alt=""></p>
</li>
</ul>
<pre><code>    : 첫 화면의** 3D 아이콘**과 다른 페이지에서 사용된 **2D 아이콘**이 통일되지 않아 혼란을 유발할 수 있음 → 단색 아이콘이나 통일된 스타일로 변경하는 것이 좋을 듯</code></pre><ul>
<li>광고의 위치 때문에 다른 페이지들(예: 호텔, 리조트, 펜션)의 디자인이 달라짐 일관성 있는 디자인을 유지하도록 수정하면 좋을 듯함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/2_7r/post/5a82561f-51cf-48f5-821d-bdded58c28a8/image.png" alt=""></p>
<ul>
<li><p><strong>카테고리 구분 개선</strong></p>
<p>  : 펜션과 풀빌라의 인기/특가 카테고리가 혼합되어 있어 사용자가 쉽게 구별할 수 없음 카드를 더 눈에 띄게 강조하거나 카테고리를 분리하여 가독성을 높이는 것이 좋을 듯함</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[3_Github Cherry-pick/checkout은 언제 사용해야할까 ? ( 개념, 차이점 )]]></title>
            <link>https://velog.io/@2_7r/3</link>
            <guid>https://velog.io/@2_7r/3</guid>
            <pubDate>Thu, 23 Jan 2025 04:55:47 GMT</pubDate>
            <description><![CDATA[<h1 id="문제상황🫠">문제상황..🫠</h1>
<p>커밋에 올리고 작업중이던 코드의 오류하나를 해결했는데</p>
<p>괜찮았던 다른 코드에서 오류가 생겼어요.. 
.................*<em>심하게.. *</em>😭</p>
<p>그래서 그 부분은 <strong>예전에 올렸던 파일</strong>을 다시 가져오고 싶은데 ~</p>
<p>이럴때는 어떻게 해야할까요 ? </p>
<hr>
<p>바로 이전 커밋이 아니더라도 ❗
<strong>그 파일만</strong> 가져올 수 있을거 같은데 ~ 분명
하고 찾아봤습니다</p>
<img src="https://velog.velcdn.com/images/2_7r/post/3d1d2a05-e422-47dd-8306-a585899ad62e/image.jpg" width="50%" >
(커..밋.. 특정 파일...가ㅈ..ㅕ오는..법)!

<p>.
.
.</p>
<p>그래서 두 가지를 발견했습니다<del>!</del>!~!</p>
<h3 id="cheery-pick"><code>cheery-pick</code></h3>
<h3 id="checkout"><code>checkout</code></h3>
<p>둘 중에 어떤 걸 사용해야할까요❓</p>
<hr>
<h1 id="cheery-pick이란">Cheery-pick이란?</h1>
<h3 id="git-cherry-pick🍒👀">Git Cherry-Pick🍒👀</h3>
<p><strong>다른 브랜치</strong>에서 어떤 특정 커밋만 콕! 집어서 내 브랜치로 가져오는 명령어</p>
<hr>
<h3 id="🐱-세부적으로는-언제-쓰냐면">🐱 세부적으로는 언제 쓰냐면</h3>
<p><strong>(1)</strong> 공통으로 merge했던 커밋을 가져와 수정할 때
<strong>(2)</strong> 팀원이 작업한 특정 커밋을 
-&gt; 내 브랜치로 끌어와 확인/추가 하고 싶을 때
<strong>(3)</strong> 버그 픽스 커밋을 다른 브랜치에서도 적용해야 할 때</p>
<hr>
<p>❗즉! <strong>다른 브랜치</strong>의 여러 커밋들 중 필요한 커밋만 선택적으로 가져와서 적용할 때 ❗</p>
<hr>
<h3 id="사용방법">사용방법</h3>
<p>** &lt;1&gt; **</p>
<pre><code>git cherry-pick &lt;커밋ID&gt;
</code></pre><p>( 원하는 커밋이 있는 위치로 이동 후 명령어 실행 )</p>
<p>** &lt;2&gt; **</p>
<img src="https://velog.velcdn.com/images/2_7r/post/01643c8b-d05d-4dd3-b6d1-5f49f0b7e543/image.png" width="30%" >
올린 커밋을 클릭하고 마우스 우측키를 누르면 🍒Cherry-pick commit🍒 이 뜹니다~


<p>.
.
.</p>
<p>⭐⭐⭐여기서 중요한 거!
<code>cheery-pick</code> 은 *<em>다른 브랜치 *</em> 에서 내 브랜치로 가져올 때 유용하다는 점입니다 <del>.</del>.....</p>
<hr>
<p>그래서 제가 하고 싶었던 것처럼
<strong>내 브랜치</strong>에 있는 걸 다시 가져오는 데는 
cherry-pick이 아닌❌❌ <strong>다른 방법</strong>을 써야한다는거죠~😮</p>
<p>그 다른 방법이  <code>checkout</code> 입니다~</p>
<hr>
<h1 id="checkout이란">Checkout이란?</h1>
<h3 id="git-checkout-🔄">Git Checkout 🔄</h3>
<p>: <code>git checkout</code>은 특정 커밋 상태로 되돌리거나, 브랜치를 전환할 때 쓰는 명령어</p>
<hr>
<h3 id="🐱-세부적으로는-언제-쓰냐면-1">🐱 세부적으로는 언제 쓰냐면</h3>
<p>(1) 특정 커밋에 있던 파일만 현재 브랜치로 가져올 때
(2) 파일 상태를 특정 커밋 상태로 복구하고 싶을 때 ⭐</p>
<hr>
<h3 id="사용방법-1">사용방법</h3>
<ul>
<li><p><strong>(1) 브랜치 이동</strong> 
: 작업하려는 다른 브랜치로 이동할 때</p>
<pre><code class="language-bash">git checkout &lt;브랜치이름&gt;</code></pre>
</li>
<li><p><strong>(2) 파일을 이전 상태로 되돌리기</strong> </p>
</li>
</ul>
<p>: 주로 현재 작업 중인 브랜치에서
 특정 커밋의 파일을 덮어씌우는 경우에 사용 ❗</p>
<pre><code class="language-bash">  git checkout &lt;커밋ID&gt; -- &lt;파일경로&gt;</code></pre>
<p> -&gt; ✨<strong>커밋 내역을 유지한 채 파일만 덮어쓸 수</strong> 있습니다.✨</p>
<hr>
<h1 id="⭐⭐-정리해봅시다-⭐⭐">⭐⭐ 정리해봅시다 ⭐⭐</h1>
<h3 id="cherry-pick-🍒--브랜치에-적용">Cherry-Pick 🍒 : 브랜치에 적용</h3>
<ul>
<li><strong>다른 브랜치에 있는 커밋 -&gt; 내 브랜치로</strong> </li>
<li>딱 필요한 커밋만 골라서 가져오는 거!</li>
<li>파일뿐만 아니라 <strong>커밋 내역을 그대로 가져와</strong> 적용하는 데 유용</li>
</ul>
<h3 id="checkout-🔄--파일-되돌리기">Checkout 🔄 : 파일 되돌리기</h3>
<ul>
<li>*<em>특정 커밋에 있던 파일만 복원하고 싶을 때 *</em></li>
<li>내 브랜치의 파일 상태를 이전 커밋 상태로 덮기</li>
</ul>
<hr>
<ul>
<li><p><strong>파일을 복원하고 싶을 때</strong> 
: <code>checkout</code> </p>
</li>
<li><p><strong>특정 커밋을 다른 브랜치에 적용</strong> 
: <code>cherry-pick</code></p>
</li>
<li><p><strong>커밋</strong> 보존하고, <strong>선택적으로 변경사항을 적용</strong> 
: <code>cherry-pick</code></p>
</li>
</ul>
<hr>
<h1 id="결론😎">결론😎</h1>
<p>저의경우
내 브랜치에 있던 파일을 복원하고 싶었던 것이니
<code>checkout</code> 을 사용하면 되겠군요 ~
.
.
.
(해결👍)
.
.
흑............다행이다 
이제 다시 열심히 개발해보겠습니다😉
안녕 ✨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2_ul 기본 스타일 초기화, box-sizing, 마진 겹침 해결법]]></title>
            <link>https://velog.io/@2_7r/2</link>
            <guid>https://velog.io/@2_7r/2</guid>
            <pubDate>Sun, 29 Dec 2024 13:17:34 GMT</pubDate>
            <description><![CDATA[<p>오늘은 🐱
두 가지 오류를 살펴보려고 한다. </p>
<hr>
<p><strong>👏 두 문제를 해결하면 알 수 있는 것</strong></p>
<ul>
<li>ul 기본 설정 값</li>
<li>border-box</li>
</ul>
<hr>
<h3 id="문제-1--왼쪽-여백-발생">문제 1 : 왼쪽 여백 발생</h3>
<p>토글목록을 만드는 중 아래와 같이 두 길이가 다른 오류가 발생했다.
<img src="https://velog.velcdn.com/images/2_7r/post/5d750d94-8a75-4d21-8fd7-125d917d2575/image.png" alt="">
이상하다..🤔 
가로 길이 똑같이 했는데 padding도 없고, border도 없는데 앞에 여백이 왜 생겼지.. </p>
<p><img src="https://velog.velcdn.com/images/2_7r/post/a1370090-17f8-467c-9efb-8b6ce84584c8/image.png" alt="">
개발자 도구를 열어 어디에 속해있는지 확인해본 결과 <strong>ul</strong> 로 묶여있었다.
.
.</p>
<p><strong>원인</strong>은 브라우저가 ul 태그에 <strong>기본적으로</strong> 적용시킨 padding-left: 40px였다. </p>
<p><strong>_그래서 ul 태그의 기본 스타일을 제거하는 코드를 추가했다. 
_</strong></p>
<pre><code>ul {
  margin: 0;           /* 기본 마진 제거 */
  padding: 0;          /* 기본 패딩 제거 */
  list-style: none;    /* 기본 리스트 스타일 제거 */
}</code></pre><p>만약에 <strong>특정 클래스</strong>에만 적용하려면 : </p>
<pre><code>.itemList {
  margin: 0;
  padding: 0;
  list-style: none; 
}</code></pre><p>이런 방식으로 해결할 수 있다.</p>
<p> _ <strong>list-style</strong>은 ul, ol 태그에 기본 적용된 리스트 아이템의 점, 숫자 등을 제거하는 속성이다._</p>
<hr>
<p>끝<del>~</del>이 아니다...</p>
<p>해결될 줄 알았는데 이번에는 *<em>길이가 다르다... *</em></p>
<p><img src="https://velog.velcdn.com/images/2_7r/post/74b7e101-bb79-4d85-b70e-2b2358b8a3d4/image.png" alt=""></p>
<p>...
padding과 border 설정은 맞게 한 거 같은데..
어떻게 수정해야할까 ?</p>
<hr>
<h3 id="문제-2--패딩-및-보더로-인한-길이-차이-발생">문제 2 : 패딩 및 보더로 인한 길이 차이 발생</h3>
<p>기본적으로 <strong>width</strong>는 컨텐츠 영역만의 너비를 의미하고, <strong>padding</strong>과 <strong>border</strong>는 width에 포함되지 않기 때문에 추가적인 여백을 차지한다.</p>
<p>아래 코드를 추가해서 해결할 수 있다!</p>
<pre><code>* {
  box-sizing: border-box;
}</code></pre><p>이 코드를 통해 width는 padding과 border를 포함한 전체 너비를 의미하게된다.</p>
<p>이렇게 설정을 바꾸면 
반응형 디자인에서도 사전에 지정된 기본 값을 유지하면서 특정 비율을 차지하게 쉽게 설정되어 용이해진다.  -&gt; 레이아웃 조절이 쉬워진다.👍
.
.
.
.</p>
<p>❗다만, 몇가지 유의가 필요하다.</p>
<h4 id="사전에-width를-설정할-때-border과-padding을-더한-값으로-설정해야함을-유의해야한다">사전에 width를 설정할 때, border과 padding을 더한 값으로 설정해야함을 유의해야한다.</h4>
<p><strong>만약 특정 padding값과 border 값으로 디자인 할 계획이라면   box-sizing: border-box; 설정이 없어도 된다.</strong> 
ㅣ 나의 경우  padding, border 값과 px값이 의도한 값에 비해 작은 차이만큼만 발생하여, 반응형에 용이하도록   box-sizing: border-box;를 사용하게 되었다.</p>
<hr>
<p>✨ 길이 차이 발생은 인접한 요소간 마진겹침 현상 때문에 발생할 수도 있다. 길이 차이가 발생한다면 마진 겹침 또한 고려해보아야한다.😉✨</p>
<p>해결..👏</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1_
CSS 클래스 적용 실패
(user agent stylesheet)
: style 파일 불러오기 실수와 해결 가이드 ]]></title>
            <link>https://velog.io/@2_7r/1</link>
            <guid>https://velog.io/@2_7r/1</guid>
            <pubDate>Sun, 29 Dec 2024 10:45:16 GMT</pubDate>
            <description><![CDATA[<p>오늘의 오류는..~🐱
글씨크기를 30px인 클래스로 적용시켰는데
더 큰 크기로! 나온 것이다 😢</p>
<p>//</p>
<p>나의 경우 Heading1이라는 variables.module.css에 저장된 스타일로 &#39;장비 대여 신청&#39;이라는 텍스트를 적으려고 했는데 
<img src="https://velog.velcdn.com/images/2_7r/post/70f31979-72f8-4fda-ae06-b8456e8e290f/image.png" alt="">
아무리봐도 이건 폰트크기가 <strong>30px</strong>이라기에는 너무 커보인다 .. 😑</p>
<p>.
.</p>
<p>개발자 도구를 들어가 확인해보았더니 _<strong>user agent stylesheet</strong>_라고 떴다. </p>
<p>user agent stylesheet로 보이는 부분은 브라우저에서 기본적으로 적용하는 스타일이라고 한다. 이걸 알기 전까지는 우선 순위고 뭐고 .. 여러 문제를 의심해봤지만 user agent stylesheet가 떴다는 것은 아무!! 스타일이 적용되지 않았다는 것이다.
(...)
<img src="https://velog.velcdn.com/images/2_7r/post/eb05b108-9184-48b8-80e8-4f7169feb331/image.png" alt=""></p>
<p>user agent stylesheet에서 내 텍스트는 h1 태그로 되어있어 자동으로 두껍고 큰 크기의 글씨로 적용되었다. 
( h1 태그는 보통 Heading 역할을 하기 때문이다. ) </p>
<p>.
.</p>
<p>❗<strong>즉, heading1이 적용되지 않았다.</strong></p>
<p>.
.
이게 내 파일 구조인데 </p>
<p>/pages
  ├── rentDetail
  │     ├── rent.module.css
  │     └── <strong>rent.tsx</strong> &lt;- <em>여기에 있는 텍스트에 스타일 적용 시킬거임</em></p>
<p>/styles
  ├── global.css
  ├── globalStyle.ts
  ├── theme.ts
  └── <strong>variables.module.css</strong>
  <img src="https://velog.velcdn.com/images/2_7r/post/b76ae5a1-1465-454e-8898-cceca7252fd7/image.png" alt=""> 내가 적은 코드는 클래스명을 바로 heading1으로 두어 오류가 발생했다.
 <img src="https://velog.velcdn.com/images/2_7r/post/35b728da-67a8-4aaf-886c-e314c9b739c0/image.png" alt=""> variables로 variable.module.css를 불러왔으니 이 안에 있는 클래스 heading1을 적용시키고 싶다면 variables.heading1으로 불러와야 적용된다!</p>
<p><strong>이 경우 이때 className에는 &quot;&quot;(문자열)이 아니라 
{}로 감싸 변수 형태로 전달해야한다는 것을 유의해야한다.</strong> </p>
<p>유의하지 않고 아래 사진처럼 쓰면 ...
 <img src="https://velog.velcdn.com/images/2_7r/post/288e6cca-937c-4c67-84bf-487323b1ffa2/image.png" alt=""> 당연히 오류가 발생한다.😊
<em>= 중괄호 {} 안에 다시 문자열로 감싼 형태이기 때문에 변수로 인식되지 않는다.</em></p>
<p>.
.</p>
<p>그래서 올바르게 변경해주고~ 
<img src="https://velog.velcdn.com/images/2_7r/post/c391169f-6704-412b-aae2-0743059bba34/image.png" alt="">
개발자 도구에 들어가 변경사항을 확인해보면~
<img src="https://velog.velcdn.com/images/2_7r/post/896265e5-43fc-4314-b1c9-1255dbbd2910/image.png" alt="">
이제 폰트크기가 30px로 올바르게 설정된 것을 확인할 수 있다. </p>
<p>.
.</p>
<p><strong>✨ 배운 점 👏✨</strong></p>
<ol>
<li><p>CSS 모듈은 클래스를 변수로 불러와야 하며, 경로를 어떻게 import 해왔는지를 고려하여 불러와야한다.</p>
</li>
<li><p>className에서 문자열이 아닌 변수를 사용할 때는 {}로 감싸야한다.</p>
</li>
<li><p>개발자 도구를 활용하여 오류를 찾고, 수정 후 적용 여부를 재검토하는 것의 중요성을 깨닫게 되었다.</p>
</li>
<li><p>user agent stylesheet의 의미</p>
</li>
</ol>
<p>//</p>
<p>해결...🥰</p>
]]></description>
        </item>
    </channel>
</rss>