<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>d-x-eg.log</title>
        <link>https://velog.io/</link>
        <description>할 수 있다!</description>
        <lastBuildDate>Tue, 22 Apr 2025 07:45:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>d-x-eg.log</title>
            <url>https://velog.velcdn.com/images/d-x-eg/profile/e92676b6-7a4f-4ed9-9bea-aeb6422683b8/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. d-x-eg.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/d-x-eg" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[아코디언 기능 이제는 details로~!]]></title>
            <link>https://velog.io/@d-x-eg/%EC%95%84%EC%BD%94%EB%94%94%EC%96%B8-%EA%B8%B0%EB%8A%A5-%EC%9D%B4%EC%A0%9C%EB%8A%94-details%EB%A1%9C</link>
            <guid>https://velog.io/@d-x-eg/%EC%95%84%EC%BD%94%EB%94%94%EC%96%B8-%EA%B8%B0%EB%8A%A5-%EC%9D%B4%EC%A0%9C%EB%8A%94-details%EB%A1%9C</guid>
            <pubDate>Tue, 22 Apr 2025 07:45:00 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/d-x-eg/post/6ffd39d8-016c-4087-ba82-cb6bd688826b/image.jpg" alt=""></p>
<h2 id="🔹-details-태그란">🔹 details 태그란?</h2>
<p>details는 사용자가 클릭해서 열고 닫을 수 있는 토글 가능한 콘텐츠 박스를 만들 때 사용
자주 사용하는 경우는 FAQ 섹션이나, 추가 정보를 숨겨뒀다가 필요할 때 보여줄 때 사용
기본적으로 닫혀 있고, 사용자가 제목 부분을 클릭하면 내용이 펼쳐지는 구조다.</p>
<pre><code>&lt;details&gt;
  &lt;summary&gt;더 보기&lt;/summary&gt; // 제목
  &lt;p&gt;이 안에는 숨겨진 내용이 들어 있어요.&lt;/p&gt; // 숨겨짐
&lt;/details&gt;</code></pre><p>&quot;더 보기&quot;라는 텍스트만 보이고, 클릭하면 <p> 태그 안의 내용이 펼쳐져 보인다.</p>
<h2 id="🔸-주요-특징">🔸 주요 특징</h2>
<p>summary 태그는 details 안에 있어야 하고, 요약(제목) 역할을 한다.</p>
<p>summary를 클릭하면 펼쳐지거나 접히게 됨.</p>
<p>CSS로 스타일링도 가능하고, open 속성을 주면 기본적으로 펼쳐진 상태로 시작 가능하다.</p>
<blockquote>
<p>  html</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/12cb0a46-1720-434e-a448-99b2e2a56e37/image.png" alt=""></p>
<pre><code>    &lt;section name=&quot;accordion&quot; &gt;
        &lt;details&gt;
            &lt;summary&gt;첫 번째&lt;/summary&gt;
            &lt;p&gt;첫 번째 내용입니다. 원하는 내용&lt;/p&gt;
        &lt;/details&gt;

        &lt;details&gt;
            &lt;summary&gt;두 번째&lt;/summary&gt;
            &lt;p&gt;두 번째 내용입니다. 원하는 정보&lt;/p&gt;
        &lt;/details&gt;
    &lt;/section&gt;</code></pre><blockquote>
<p> css</p>
</blockquote>
<p>  <img src="https://velog.velcdn.com/images/d-x-eg/post/b52195d8-6365-46e4-8536-1ea2694521db/image.png" alt=""></p>
<pre><code>  body {
    font-family: &#39;Segoe UI&#39;, sans-serif;
    background-color: #f4f4f4;
    padding: 40px;
    }

details {
    background: white;
    border: 1px solid #ddd;
    border-radius: 8px;
    padding: .5rem;
    margin-bottom: 10px;
    transition: box-shadow 0.3s;
    position: relative;
}

details[open] {
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
}

  summary {
  font-weight: 600;
  cursor: pointer;
  position: relative;
  padding: 12px 40px 12px 20px;
  display: block;
  list-style-type: none;
  }


details p {
    margin: 0;
    padding: 15px 20px 20px;
    color: #444;
    line-height: 1.6;

}
summary::marker {
    display: none;
}

summary::-webkit-details-marker {
display: none; /* Chrome, Safari 등 */
}

/* 화살표 아이콘 */
summary::after {
    content: &#39;▶&#39;;
    position: absolute;
    right: 20px;
    top: 50%;
    transform: translateY(-50%);
    transition: transform 0.3s ease;
}

details[open] summary::after {
    transform: translateY(-50%) rotate(90deg);
}
</code></pre><p>까지만 해도 </p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/26c4b36e-290e-4066-a026-4dd5adb65271/image.png" alt=""></p>
<p>이렇게만 넣어줘도 되지만
이러면 클릭시 여닫히지만 해당제목 클릭시 다른제목도 열려있다.
이걸 하나만 열리게 하려면 쉽게 jquery를 사용하면 된다.</p>
<blockquote>
<p>jq</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/9acc4572-08bb-4501-b114-778cf867cb4b/image.png" alt=""></p>
 <div style="display:none">

<pre><code>$(document).ready(function () {
    $(&quot;details &gt; summary&quot;).on(&quot;click&quot;, function () {
        const clicked = $(this).parent();
        setTimeout(function () {
        $(&quot;details&quot;).not(clicked).removeAttr(&quot;open&quot;);
        }, 1);
    });
});</code></pre> </div>




<blockquote>
<p>완성</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/0bdb876a-2285-4f1c-8421-adb74e781c6e/image.png" alt=""></p>
<p>그럼 다른 제목 클릭시 보던 제목은 닫히고 클릭한 제목만 열린다.</p>
<p>wow 이제 드롭다운은 굳이 js, jq 를 안써도 된다는 말씀 ㅎㅎ</p>
<p>사실 굳이 setTimeout 안해도 되지만 그래도 에니메이션이 있는거와 없는건 차이가 크니까 ㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[반복문(while do..while)]]></title>
            <link>https://velog.io/@d-x-eg/%EC%BD%94%EB%93%9C%EA%B3%B5%EB%B6%80while-do..while</link>
            <guid>https://velog.io/@d-x-eg/%EC%BD%94%EB%93%9C%EA%B3%B5%EB%B6%80while-do..while</guid>
            <pubDate>Fri, 18 Apr 2025 08:12:10 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/d-x-eg/post/176983b5-97b3-4ded-8e3c-1ff3bc0b9c3a/image.jpg" alt=""></p>
<h1 id="✅while">✅while</h1>
<p>while (조건) {
    // 반복할 코드
}
💡 1부터 5까지 출력</p>
<pre><code>let i = 1;
while(i&lt;=3){
    console.log(i);
i++
}</code></pre><hr>
<h2 id="1단계">1단계</h2>
<h3 id="1부터-100까지의-짝수만-출력하기-while문-사용">1부터 100까지의 짝수만 출력하기 (while문 사용)</h3>
<pre><code>let i = 1;
while (i &lt;= 100) {
    if (i % 2 === 0) {
        console.log(i);  // 짝수일 때만 출력
    }
    i++; // 반복문을 돌리기 위해 증가시킴
}</code></pre><p>또는</p>
<pre><code>let i = 2;
while (i &lt;= 100) {
    console.log(i);
    i += 2;
}</code></pre><hr>
<h2 id="2단계">2단계</h2>
<h3 id="사용자-입력까지-더하기">사용자 입력까지 더하기</h3>
<pre><code>
let sum = 0; // 합계 저장용
let input = prompt(&quot;숫자를 입력하세요 (종료하려면 Enter):&quot;);

while (input !== &quot;&quot;) { // 입력이 비어있지 않은 동안 계속 반복
    sum += Number(input); // 입력값을 숫자로 바꿔 더하기 // 문자열을 숫자로 바꿔서 누적 합산
    input = prompt(&quot;숫자를 입력하세요 (종료하려면 Enter):&quot;);
}

alert(`총합: ${sum}`); // 반복이 끝나면 총합 알림창으로 보여주기
</code></pre><h2 id="3단계">3단계</h2>
<h3 id="3의배수-합-구하기">3의배수 합 구하기</h3>
<pre><code>let sum = 0; // 합계 저장용
let input = prompt(&quot;숫자를 입력하세요 (종료하려면 Enter):&quot;);

while (input !== &quot;&quot;) {
    if(input % 3=== 0){
        sum += Number(input); // 입력값을 숫자로 바꿔 더하기
        input = prompt(&quot;숫자를 입력하세요 (종료하려면 Enter):&quot;);
    } else {
        input = prompt(&quot;숫자를 입력하세요 (종료하려면 Enter):&quot;);
    }
}

alert(`총합: ${sum}`);
</code></pre><p>더 간결하게 </p>
<pre><code>let sum = 0;
let input = prompt(&quot;숫자를 입력하세요 (종료하려면 Enter):&quot;);

while (input !== &quot;&quot;) {
    if (Number(input) % 3 === 0) {
        sum += Number(input);
    }

    input = prompt(&quot;숫자를 입력하세요 (종료하려면 Enter):&quot;);
}

alert(`총합: ${sum}`);</code></pre><h2 id="4단계">4단계</h2>
<h3 id="짝수는-더하고-홀수는-빼기">짝수는 더하고 홀수는 빼기</h3>
<pre><code>let sum  =0;
let input = prompt(&quot;숫자만 입력&quot;);

while(input !== &quot;&quot;){
    const num = Number(input)
    if(num % 2 === 0){
        sum  += num;
        input = prompt(&quot;더하기 완료&quot;);
    } else {
        sum  -= num;
        input = prompt(&quot;빼기 완료&quot;);
    }
}
alert(`총합은 ${sum }`);</code></pre><h1 id="✅dowhile">✅do...while</h1>
<pre><code>do {
    // 실행할 코드
} while (조건);</code></pre><p>✅ 작동 흐름</p>
<ol>
<li>do 블록 안의 코드를 무조건 한 번 실행하고</li>
<li>while(조건)을 검사해서</li>
<li>조건이 참(true) 이면 다시 실행</li>
<li>조건이 거짓(false) 이면 멈춤</li>
</ol>
<p>✅ while vs do...while
구문 | 실행 순서 | 조건이 처음부터 false면?
while | 조건 → 실행 | 아예 실행 안 됨
do...while | 실행 → 조건 | 한 번은 실행됨</p>
<h2 id="1단계-1">1단계</h2>
<h3 id="짝수와-홀수-구분하기">짝수와 홀수 구분하기</h3>
<p>let input;
do {
  input = prompt(&quot;숫자만 입력하세요 (종료하려면 Enter):&quot;);
  if (input === &quot;&quot;) break;            // 빈 문자열이면 종료
  const num = Number(input);         // 숫자로 변환
  if (isNaN(num)) {
    alert(&quot;숫자가 아닙니다!&quot;);
    continue;                         // 잘못된 입력이면 다시 루프
  }</p>
<p>  if (num % 2 === 0) {
    console.log(<code>${num}는 짝수입니다.</code>);
  } else {
    console.log(<code>${num}는 홀수입니다.</code>);
  }</p>
<p>} while (true);</p>
<h2 id="2단계-1">2단계</h2>
<h3 id="1부터-100까지-fizzbuzz">1부터 100까지 FizzBuzz</h3>
<pre><code>let sum = 0; // 초기 합계는 0
do {
    let input = prompt(&quot;숫자를 입력하세요 (엔터시 종료):&quot;);

    // 엔터를 눌러서 종료하는 경우
    if (input === &quot;&quot;) {
        break; // 빈 문자열 입력 시 종료
    }

    sum = Number(input); // 입력을 숫자로 변환

    if (sum % 15 === 0) {
        console.log(&quot;FizzBuzz&quot;);
    } else if (sum % 3 === 0) {
        console.log(&quot;Fizz&quot;);
    } else if (sum % 5 === 0) {
        console.log(&quot;Buzz&quot;);
    } else {
        console.log(sum);
    }

} while (true); // true일 때 반복</code></pre><h2 id="3단계-1">3단계</h2>
<h3 id="사용자-입력-값에-맞는-별찍기">사용자 입력 값에 맞는 *별찍기</h3>
<pre><code>let rows = Number(prompt(&quot;몇 줄??&quot;));
let i = 1;

do {
  let line = &quot;&quot;;
  let j = 1;

  do {
    line += &quot;*&quot;;
    j++;
  } while (j &lt;= i);

  console.log(line);
  i++;
} while (i &lt;= rows);</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[반복문(for의 3가지 규칙)]]></title>
            <link>https://velog.io/@d-x-eg/%EB%B0%98%EB%B3%B5%EB%AC%B8for%EC%9D%98-3%EA%B0%80%EC%A7%80-%EA%B7%9C%EC%B9%99</link>
            <guid>https://velog.io/@d-x-eg/%EB%B0%98%EB%B3%B5%EB%AC%B8for%EC%9D%98-3%EA%B0%80%EC%A7%80-%EA%B7%9C%EC%B9%99</guid>
            <pubDate>Wed, 09 Apr 2025 08:57:04 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/d-x-eg/post/44d5fe7b-6bb9-471d-bb56-617977bbd8b0/image.jpg" alt=""></p>
<p><strong>for의 3가지 규칙
for (초기값; 조건; 증감식) {
  // 반복할 코드
}</strong></p>
<blockquote>
<p>초기값: 반복을 시작하기 위한 변수 설정 (보통 let i = 0)
조건: 이 조건이 true일 때만 반복됨 (예: i &lt; 5)
증감식: 한 번 반복이 끝난 후 실행되는 코드 (보통 i++로 숫자 1 증가)</p>
</blockquote>
<h3 id="🔄1단계">🔄1단계</h3>
<h4 id="1부터-10까지-출력하기">1부터 10까지 출력하기</h4>
<pre><code>for(let i = 0; i &lt;= 10; i++){
    console.log(i);

}</code></pre><h3 id="🔄15단계응용">🔄1.5단계(응용)</h3>
<h4 id="짝수만-출력하기-120">짝수만 출력하기 (1~20)</h4>
<pre><code>for (let i = 0; i &lt;= 20; i += 2) {
    console.log(i);
}</code></pre><h3 id="🔄2단계">🔄2단계</h3>
<h4 id="배열-출력하기">배열 출력하기</h4>
<pre><code>const animals = [&#39;dog&#39;, &#39;cat&#39;, &#39;rabbit&#39;, &#39;hamster&#39;];

for(var i = 0; i &lt; animals.length; i++) {
    console.log(animals[i]);
}</code></pre><p>💡 해설:
animals.length: 배열의 길이 (4)</p>
<p>i는 0부터 시작해서 3까지 반복 (0, 1, 2, 3)</p>
<p>animals[i]는 배열에서 i번째 요소</p>
<h3 id="🔄3단계">🔄3단계</h3>
<h4 id="합계-구하기">합계 구하기</h4>
<pre><code>let sum = 0;
for (let i = 0; i &lt;= 100; i++ ) {
        sum += i ;
    }
console.log(sum + i);</code></pre><p>💡 해설:
let sum = 0: 합계를 저장할 변수</p>
<p>i는 1부터 100까지 반복</p>
<p>sum += i: 반복마다 i를 계속 sum에 더함</p>
<p>반복이 끝나면 sum에는 1~100까지의 총합이 저장됨</p>
<h3 id="🔄4단계">🔄4단계</h3>
<h4 id="구구단-2단">구구단 2단</h4>
<pre><code>let dan = 2;
for (let i = 0; i &lt;= 9; i++) {
  console.log(`${dan} * ${i} = ${dan * i}`);
}
</code></pre><h3 id="🔄45단계응용">🔄4.5단계(응용)</h3>
<h4 id="구구단-29단">구구단 2~9단</h4>
<p>이중for문 사용</p>
<pre><code>for (let i = 0; i &lt;= 9; i++) {
    for(let j = 0; j &lt;= 9; j++) {
        console.log(`${i} * ${j} = ${i * j}`);
    }
}</code></pre><h3 id="🔄45단계심화">🔄4.5단계(심화)</h3>
<h4 id="구구단-29단-가로-배치">구구단 2~9단 가로 배치</h4>
<pre><code>for (let i = 2; i &lt;= 9; i++) {
    line = &#39;&#39;; // 매 단마다 초기화
    for(let j = 1; j &lt;= 9; j++) {
        line += `${i} * ${j} = ${i * j}  `;
    }
    console.log(line); // 한 줄 출력
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[조건문(switch) 코드공부]]></title>
            <link>https://velog.io/@d-x-eg/%EC%A1%B0%EA%B1%B4%EB%AC%B8switch-%EC%BD%94%EB%93%9C%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@d-x-eg/%EC%A1%B0%EA%B1%B4%EB%AC%B8switch-%EC%BD%94%EB%93%9C%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Tue, 08 Apr 2025 08:51:02 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/d-x-eg/post/cd64f3ca-7bfa-4893-904c-8d5464570d02/image.png" alt=""></p>
<p>switch 문은 여러 조건을 한 번에 비교하여 처리할 때 유용하게 사용
여러 if-else if 문을 사용하는 대신, switch 문을 사용하면 코드가 간결하고 읽기 쉽다.
switch 문은 특정 변수의 값에 따라 실행할 코드 블록을 선택</p>
<pre><code>switch (expression) {
    case value1:
    // expression이 value1일 때 실행되는 코드
    break;
    case value2:
    // expression이 value2일 때 실행되는 코드
    break;
    case value3:
    // expression이 value3일 때 실행되는 코드
    break;
    default:
    // 위의 case들이 모두 맞지 않으면 실행되는 코드
}</code></pre><p>expression: 비교할 값이 들어가는 부분 예를 들어, 숫자, 문자열, 또는 변수</p>
<h3 id="1단계">1단계</h3>
<h4 id="숫자에-따른-요일-출력">숫자에 따른 요일 출력</h4>
<pre><code>let day = prompt(&quot;1~7 입력 &quot;);  // 1~7중 입력
day = Number(day);  // 입력값을 숫자로 변환
switch (day) {
  case 1:
    console.log(&quot;월요일&quot;);
    break;
  case 2:
    console.log(&quot;화요일&quot;);
    break;
  case 3:
    console.log(&quot;수요일&quot;);
    break;
  case 4:
    console.log(&quot;목요일&quot;);
    break;
  case 5:
    console.log(&quot;금요일&quot;);
    break;
  case 6:
    console.log(&quot;토요일&quot;);
    break;
  case 7:
    console.log(&quot;일요일&quot;);
    break;
  default:
    console.log(&quot;1~7 중 입력&quot;);
}</code></pre><h3 id="15단계응용">1.5단계(응용)</h3>
<h4 id="숫자일때-문자-일떄-if문-써서-맞게-나오게">숫자일때 문자 일떄 if문 써서 맞게 나오게</h4>
<pre><code>let day = prompt(&quot;1 ~ 7 또는 일 ~ 칠 입력&quot;);

let dayNum = Number(day); // day를 숫자로 변환

if (!isNaN(dayNum)) { // 숫자일 때 처리
    switch(dayNum) {
        case 1:
            console.log(&quot;월요일&quot;);
            break;
        case 2:
            console.log(&quot;화요일&quot;);
            break;
        case 3:
            console.log(&quot;수요일&quot;);
            break;
        case 4:
            console.log(&quot;목요일&quot;);
            break;
        case 5:
            console.log(&quot;금요일&quot;);
            break;
        case 6:
            console.log(&quot;토요일&quot;);
            break;
        case 7:
            console.log(&quot;일요일&quot;);
            break;
        default:
            console.log(&quot;1~7 중 입력&quot;);
    }
} else if (typeof day === &#39;string&#39;) { // 문자열일 때 처리
    switch (day) {
        case &quot;일&quot;:
            console.log(&quot;월요일&quot;);
            break;
        case &quot;이&quot;:
            console.log(&quot;화요일&quot;);
            break;
        case &quot;삼&quot;:
            console.log(&quot;수요일&quot;);
            break;
        case &quot;사&quot;:
            console.log(&quot;목요일&quot;);
            break;
        case &quot;오&quot;:
            console.log(&quot;금요일&quot;);
            break;
        case &quot;육&quot;:
            console.log(&quot;토요일&quot;);
            break;
        case &quot;칠&quot;:
            console.log(&quot;일요일&quot;);
            break;
        default:
            console.log(&quot;일, 이, 삼, 사, 오, 육, 칠 중 입력&quot;);
    }
} else {
    alert(&quot;숫자(1~7) 또는 문자(일~칠)를 입력하세요.&quot;);
}</code></pre><h3 id="15단계심화">1.5단계(심화)</h3>
<h4 id="코드-단축-객체화시키기">코드 단축 객체화시키기</h4>
<pre><code>let day = prompt(&quot;1 ~ 7 또는 일 ~ 칠 입력&quot;);

// 숫자와 문자에 대한 요일 매핑 객체
const daysOfWeek = {
1: &quot;월요일&quot;,
2: &quot;화요일&quot;,
3: &quot;수요일&quot;,
4: &quot;목요일&quot;,
5: &quot;금요일&quot;,
6: &quot;토요일&quot;,
7: &quot;일요일&quot;,
일: &quot;월요일&quot;,
이: &quot;화요일&quot;,
삼: &quot;수요일&quot;,
사: &quot;목요일&quot;,
오: &quot;금요일&quot;,
육: &quot;토요일&quot;,
칠: &quot;일요일&quot;
};

let dayNum = Number(day);// 입력을 숫자로 변환

// 숫자일 때 처리
if (!isNaN(dayNum) &amp;&amp; daysOfWeek[dayNum]) {
  console.log(daysOfWeek[dayNum]);
} 
// 문자일 때 처리
else if (daysOfWeek[day]) {
  console.log(daysOfWeek[day]);
} else {
  alert(&quot;숫자(1~7) 또는 문자(일~칠)를 입력하세요.&quot;);
}</code></pre><h3 id="2단계">2단계</h3>
<h4 id="점수에-맞는-학점">점수에 맞는 학점</h4>
<pre><code>let score  = prompt(&quot;점수 입력&quot;);

switch (true) {
  case (score &gt;= 101):
    console.log(&quot;100이하로&quot;);
    break;
  case (score &gt;= 90):
    console.log(&quot;A 학점입니다.&quot;);
    break;
  case (score &gt;= 80):
    console.log(&quot;B 학점입니다.&quot;);
    break;
  case (score &gt;= 70):
    console.log(&quot;C 학점입니다.&quot;);
    break;
  default:
    console.log(&quot;F 학점입니다.&quot;);
}
</code></pre><h3 id="3단계">3단계</h3>
<h4 id="이벤트-티켓-가격-계산기">이벤트 티켓 가격 계산기</h4>
<p>티켓 종류 (&quot;학생&quot;, &quot;일반인&quot;, &quot;노인&quot;, &quot;어린이&quot;)
학생: 10,000원
일반인: 20,000원
노인: 10,000원
어린이: 5,000원</p>
<p>회원 유형 (&quot;단체&quot;, &quot;VIP&quot;, &quot;일반&quot;)
단체(10명 이상): 50% 할인
VIP: 30% 할인
일반: 할인 없음</p>
<pre><code>let ticket  = prompt(&quot;학생, 일반, 노인, 어린이&quot;); // 1차 종류 입력
let counter  = prompt(&quot;단체, VIP, 일반&quot;); // 2차 유형 입력

let basePrice //기본 가격 설정

switch(ticket){ //1차 종류에 대한 처리
    case &quot;학생&quot;:
        basePrice = 10000;
    break;
    case &quot;일반&quot;:
        basePrice = 20000;
    break;
    case &quot;노인&quot;:
        basePrice = 10000;
    break;
    case &quot;어린이&quot;:
        basePrice = 5000;
    break;
    default:
        console.log(&quot;잘못된 티켓&quot;);
    break;
}

let final = basePrice; 1차에 대한 결과값에 유형 추가를 위한 처리

switch(counter){ //2차 유형에 대한 처리
    case &quot;단체&quot;:
    final = basePrice * 0.5; 
    break;
    case &quot;VIP&quot;:
    final = basePrice * 0.7;
    break;
    case &quot;일반&quot;:
        // 일반은 기본 가격 그대로
    break;
    default:
        console.log(&quot;잘못된 회원&quot;);
    break;
}

// basePrice 값이 맞게 들어왔으면 실행하게
if(basePrice) {
    console.log(`최종가격은 : ${final}원`);
}</code></pre><hr>
<p>예시1)
티켓 종류: 어린이
회원 유형: 단체</p>
<p>최종 가격: 2500원 (5,000원에서 50% 할인)</p>
<hr>
<p>예시2)
티켓 종류: 학생
회원 유형: 일반</p>
<p>최종 가격: 10000원</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[조건문(if, else, else if) 코드공부]]></title>
            <link>https://velog.io/@d-x-eg/%EC%A1%B0%EA%B1%B4%EB%AC%B8if-else-else-if-%EC%BD%94%EB%93%9C%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@d-x-eg/%EC%A1%B0%EA%B1%B4%EB%AC%B8if-else-else-if-%EC%BD%94%EB%93%9C%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Mon, 07 Apr 2025 07:07:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/d-x-eg/post/ad555934-50ac-4e8f-b6d7-8ecef520eaa5/image.jpg" alt=""></p>
<h2 id="1-1-조건문-if-else">1-1 조건문 (if, else)</h2>
<p>조건문은 어떤 조건이 맞으면 특정 코드를 실행하는 구조</p>
<h3 id="1단계">1단계</h3>
<h4 id="ge가-18-이상일-때-성인라고-출력">ge가 18 이상일 때 &quot;성인&quot;라고 출력</h4>
<pre><code>let age = prompt(&quot;나이를 입력하세요: &quot;);
if(age&gt;= 18){
    alert(&quot;성인&quot;);
}else {
    alert(&quot;미성년자&quot;);
}</code></pre><h3 id="2단계">2단계</h3>
<h4 id="score가-70-이상일-때-합격라고-출력">score가 70 이상일 때 &quot;합격&quot;라고 출력</h4>
<pre><code>let score = prompt(&quot;점수를 입력하세요: &quot;);

if(score&gt;=70) {
    alert(&quot;합격&quot;);
}else{
    alert(&quot;불격&quot;);
}</code></pre><h3 id="3단계">3단계</h3>
<h4 id="사용자의-아이디와-비밀번호를-비교하여-둘-다-맞으면-성공-아니면-실패를-출력">사용자의 아이디와 비밀번호를 비교하여, 둘 다 맞으면 &quot;성공&quot;, 아니면 &quot;실패&quot;를 출력</h4>
<pre><code>let username = prompt(&quot;아이디를 입력하세요: &quot;);
let password = prompt(&quot;비밀번호를 입력하세요: &quot;);

if(username === &quot;user&quot; &amp;&amp; password === &quot;1234&quot;){
    alert(&quot;성공&quot;);
}else {
    alert(&quot;실패&quot;);
}
</code></pre><h3 id="4단계">4단계</h3>
<h4 id="숫자입력이-홀수면-홀-짝수면-짝-출력">숫자입력이 홀수면 &quot;홀&quot; 짝수면 &quot;짝&quot; 출력</h4>
<pre><code>let num = prompt(&quot;숫자를 입력하세요: &quot;);
if(num % 2 === 0 ){
    alert(&quot;짝&quot;);
}else {
    alert(&quot;홀&quot;);
}</code></pre><hr>
<h2 id="1-2-조건문-else-if">1-2 조건문 (else if)</h2>
<h3 id="1단계-1">1단계</h3>
<h4 id="score가-80-이상-90-미만일-때-b를-출력">score가 80 이상 90 미만일 때 &quot;B&quot;를 출력</h4>
<pre><code>let score = prompt(&quot;점수를 입력하세요: &quot;);
if (score &gt;= 90) {
    console.log(&quot;A&quot;);
} else if (score &gt;= 80) {
    console.log(&quot;B&quot;);
} else {
    console.log(&quot;C&quot;);
}</code></pre><h3 id="2단계-1">2단계</h3>
<h4 id="사용자가-입력한-점수별-출력">사용자가 입력한 점수별 출력</h4>
<p>// 90점 이상: &quot;A&quot;
// 80점 이상 90점 미만: &quot;B&quot;
// 70점 이상 80점 미만: &quot;C&quot;
// 60점 이상 70점 미만: &quot;D&quot;
// 60점 미만: &quot;F&quot;</p>
<pre><code>let score = prompt(&quot;점수를 입력하세요: &quot;);

if(score&gt;=90) {
    console.log(&quot;A&quot;);
}else if(score&gt;=80){
    console.log(&quot;B&quot;);
}else if(score&gt;=70){
    console.log(&quot;C&quot;);
}else if(score&gt;=60){
    console.log(&quot;D&quot;);
}else{
    console.log(&quot;F&quot;);
}
</code></pre><h3 id="3단계-1">3단계</h3>
<h4 id="사용자가-입력한-112월-사이의-숫자에-따라-계절을-출력">사용자가 입력한 1~12월 사이의 숫자에 따라 계절을 출력</h4>
<p>// 12, 1, 2월: &quot;겨울&quot;
// 3, 4, 5월: &quot;봄&quot;
// 6, 7, 8월: &quot;여름&quot;
// 9, 10, 11월: &quot;가을&quot;</p>
<pre><code>let month = prompt(&quot;월을 입력하세요 (1부터 12까지): &quot;);
if(month == 12 || month == 1 || month == 2){
    console.log(&quot;겨울&quot;);
}else if(month &gt;= 3 &amp;&amp; month &lt;= 5){
    console.log(&quot;봄&quot;);

}else if(month &gt;= 6 &amp;&amp; month &lt;= 8){
    console.log(&quot;여름&quot;);
}else if(month &gt;= 9 &amp;&amp; month &lt;= 11){
    console.log(&quot;가을&quot;);
}else {
    console.log(&quot;1~12까지만&quot;);
}</code></pre><h3 id="3단계-tip">3단계 *tip</h3>
<h4 id="만약-여기서-절대값으로-조건을-한다면">만약 여기서 절대값으로 조건을 한다면?</h4>
<pre><code>let month = prompt(&quot;월을 입력하세요 (1부터 12까지): &quot;);  // 사용자로부터 월을 입력받음
month = Number(month);  // 입력값을 숫자로 변환

if (month === 12 || month === 1 || month === 2) {
  console.log(&quot;겨울&quot;);
} else if (month &gt;= 3 &amp;&amp; month &lt;= 5) {
  console.log(&quot;봄&quot;);
} else if (month &gt;= 6 &amp;&amp; month &lt;= 8) {
  console.log(&quot;여름&quot;);
} else if (month &gt;= 9 &amp;&amp; month &lt;= 11) {
  console.log(&quot;가을&quot;);
} else {
  console.log(&quot;잘못된 월입니다. 1부터 12까지의 숫자를 입력하세요.&quot;);
}
</code></pre><h3 id="4단계-1">4단계</h3>
<h4 id="18세-이하-10-할인-19세-이상-65세-이하-5-할인-66세-이상-15-할인--0세-이하-100세-이상잘못된-나이">18세 이하 10% 할인, 19세 이상 65세 이하 5% 할인, 66세 이상 15% 할인,  0세 이하 100세 이상<strong><code>잘못된 나이</code></strong></h4>
<pre><code>
var age = prompt(&quot;나이를 입력하세요&quot;);  // 나이 입력
var val = prompt(&quot;금액을 입력하세요&quot;);  // 금액 입력

val = Number(val);  // 입력된 금액을 숫자로 변환
age = Number(age);  // 입력된 나이를 숫자로 변환

if (age &lt; 0 || age &gt; 100) {  // 나이가 0세 이하이거나 100세 이상이면
    console.log(&quot;다시 입력&quot;);
} else if (age &gt;= 66) {  // 66세 이상인 경우
    console.log(&quot;20% 할인&quot;);
    console.log(&quot;할인 금액: &quot; + (val * 0.8));  // 20% 할인
} else if (age &gt;= 19) {  // 19세 이상 65세 이하인 경우
    console.log(&quot;5% 할인&quot;);
    console.log(&quot;할인 금액: &quot; + (val * 0.95));  // 5% 할인
} else if (age &lt;= 18) {  // 18세 이하인 경우
    console.log(&quot;10% 할인&quot;);
    console.log(&quot;할인 금액: &quot; + (val * 0.9));  // 10% 할인
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[jQuery 메서드 정리]]></title>
            <link>https://velog.io/@d-x-eg/jQuery-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@d-x-eg/jQuery-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 04 Apr 2025 02:22:34 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/d-x-eg/post/a9703b08-2e1b-4c86-86af-ad51f380c322/image.webp" alt="">
  1.일반 노드
 <table>
        <thead>
            <tr>
                <th>분류</th>
                <th>핵심 내용</th>
                <th>핵심 프로퍼티 및 메서드</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>아이디로 찾기</td>
                <td>아이디 이름으로 노드 찾기</td>
                <td>$(&quot;#아이디&quot;)</td>
            </tr>
            <tr>
                <td>태그로 찾기</td>
                <td>태그 이름으로 노드 찾기</td>
                <td>$(&quot;태그 이름&quot;)</td>
            </tr>
            <tr>
                <td>클래스 이름으로 찾기</td>
                <td>클래스 이름으로 노드 찾기</td>
                <td>$(&quot;.클래스 이름&quot;)</td>
            </tr>
            <tr>
                <td>속성으로 찾기</td>
                <td>속성으로 노드 찾기</td>
                <td>$(&quot;[속성=값]&quot;)</td>
            </tr>
        </tbody>
    </table></p>
  <p> 2.찾은 노드 다루기</p>


  <table>
        <thead>
            <tr>
                <th>분류</th>
                <th>핵심 내용</th>
                <th>핵심 프로퍼티 및 메서드</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>노드 개수 구하기</td>
                <td>찾은 노드의 개수 확인</td>
                <td>$대상.length</td>
            </tr>
            <tr>
                <td>n번째 노드 접근하기</td>
                <td>n번째 노드 접근</td>
                <td>$대상.eq(index)</td>
            </tr>
            <tr>
                <td>자바스크립트 DOM 객체 접근</td>
                <td>자바스크립트 DOM 객체로 접근</td>
                <td>$대상.get(index) 또는 $대상[index]</td>
            </tr>
            <tr>
                <td>순차적으로 노드 접근하기</td>
                <td>순차적으로 각 노드에 접근</td>
                <td>$대상.each(function(index){ $(this); })</td>
            </tr>
            <tr>
                <td>특정 노드 찾기</td>
                <td>특정 노드만 필터링</td>
                <td>$대상.filter("선택자")</td>
            </tr>
            <tr>
                <td>자손 노드 찾기</td>
                <td>자손 노드 중 특정 노드 찾기</td>
                <td>$대상.find("선택자")</td>
            </tr>
            <tr>
                <td>인덱스 구하기</td>
                <td>노드의 인덱스 구하기</td>
                <td>$대상.index() 또는 $목록.index($대상)</td>
            </tr>
        </tbody>
    </table>

<p> 3. 자식 노드 찾기</p>
    <table>
        <thead>
            <tr>
                <th>분류</th>
                <th>핵심 내용</th>
                <th>핵심 프로퍼티 및 메서드</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>모든 자식 노드 찾기</td>
                <td>자식 노드를 모두 찾기</td>
                <td>$대상.children()</td>
            </tr>
            <tr>
                <td>특정 자식 노드 찾기</td>
                <td>특정 자식 노드만 찾기</td>
                <td>$대상.children("선택자")</td>
            </tr>
            <tr>
                <td>첫 번째 자식 노드 찾기</td>
                <td>첫 번째 자식 노드 찾기</td>
                <td>$대상.children().first() 또는 $대상.children(":first")</td>
            </tr>
            <tr>
                <td>마지막 자식 노드 찾기</td>
                <td>마지막 자식 노드 찾기</td>
                <td>$대상.children().last() 또는 $대상.children(":last")</td>
            </tr>
            <tr>
                <td>n번째 자식 노드 찾기</td>
                <td>n번째 자식 노드 찾기</td>
                <td>$대상.children().eq(index)</td>
            </tr>
        </tbody>
    </table>

<pre><code>&lt;p&gt;4. 부모 노드 찾기&lt;/p&gt;

&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;분류&lt;/th&gt;
            &lt;th&gt;핵심 내용&lt;/th&gt;
            &lt;th&gt;핵심 프로퍼티 및 메서드&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;부모 노드 찾기&lt;/td&gt;
            &lt;td&gt;부모 노드 찾기&lt;/td&gt;
            &lt;td&gt;$대상.parent()&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;조상 노드 찾기&lt;/td&gt;
            &lt;td&gt;조상 노드 찾기&lt;/td&gt;
            &lt;td&gt;$대상.parents([&quot;선택자&quot;])&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;</code></pre><p>  5. 형제 노드 찾기</p>
    <table>
        <thead>
            <tr>
                <th>분류</th>
                <th>핵심 내용</th>
                <th>핵심 프로퍼티 및 메서드</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>이전 형제 노드 찾기</td>
                <td>이전 형제 노드 찾기</td>
                <td>$대상.prev() 또는 $대상.prevAll()</td>
            </tr>
            <tr>
                <td>다음 형제 노드 찾기</td>
                <td>다음 형제 노드 찾기</td>
                <td>$대상.next() 또는 $대상.nextAll()</td>
            </tr>
        </tbody>
    </table>
<p>6. 노드 생성 및 추가</p>
    <table>
        <thead>
            <tr>
                <th>분류</th>
                <th>핵심 내용</th>
                <th>핵심 프로퍼티 및 메서드</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>노드 생성</td>
                <td>새로운 노드 생성</td>
                <td>$("추가할 노드 HTML")</td>
            </tr>
            <tr>
                <td>첫 번째 자식으로 추가</td>
                <td>첫 번째 자식으로 노드 추가</td>
                <td>$부모노드.prepend($추가노드)</td>
            </tr>
            <tr>
                <td>마지막 자식으로 추가</td>
                <td>마지막 자식으로 노드 추가</td>
                <td>$부모노드.append($추가노드)</td>
            </tr>
            <tr>
                <td>특정 위치 이전에 추가</td>
                <td>특정 노드 이전에 추가</td>
                <td>$기준노드.before($추가노드)</td>
            </tr>
            <tr>
                <td>특정 위치 이후에 추가</td>
                <td>특정 노드 이후에 추가</td>
                <td>$기준노드.after($추가노드)</td>
            </tr>
        </tbody>
    </table>
<p>7. 노드 제거</p>
    <table>
        <thead>
            <tr>
                <th>분류</th>
                <th>핵심 내용</th>
                <th>핵심 프로퍼티 및 메서드</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>특정 노드 제거</td>
                <td>특정 노드 제거</td>
                <td>$대상.remove()</td>
            </tr>
            <tr>
                <td>모든 자식 노드 제거</td>
                <td>모든 자식 노드 제거</td>
                <td>$대상.children().remove()</td>
            </tr>
        </tbody>
    </table>
<p>8. 노드 내용 읽기 및 변경</p>
    <table>
        <thead>
            <tr>
                <th>분류</th>
                <th>핵심 내용</th>
                <th>핵심 프로퍼티 및 메서드</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>노드 내용 읽기 (태그 포함)</td>
                <td>노드 내용을 HTML로 읽기</td>
                <td>$대상.html()</td>
            </tr>
            <tr>
                <td>노드 내용 읽기 (텍스트)</td>
                <td>노드 내용을 텍스트로 읽기</td>
                <td>$대상.text()</td>
            </tr>
            <tr>
                <td>노드 내용 수정</td>
                <td>노드 내용을 수정하기</td>
                <td>$대상.html("수정된 내용") 또는 $대상.text("수정된 텍스트")</td>
            </tr>
            <tr>
                <td>여러 자식 노드 추가</td>
                <td>HTML로 여러 자식 노드 추가</td>
                <td>$대상.html("여러 자식 노드 HTML")</td>
            </tr>
            <tr>
                <td>모든 자식 노드 제거</td>
                <td>모든 자식 노드를 제거</td>
                <td>$대상.html("")</td>
            </tr>
        </tbody>
    </table>
        <style>
        table {
            width: 100%;
            border-collapse: collapse;
            border: 1px solid #ccc;
            magin-bottom:10px;
        }
        th, td {
            padding: 8px 12px;
            text-align: left;
            border: 1px solid #ccc;
        }
        th {
            background-color: #f4f4f4;
        }
        tr:nth-child(even) {
            background-color: #f9f9f9;
        }
        td {
            vertical-align: top;
        }
    </style>]]></description>
        </item>
        <item>
            <title><![CDATA[폴드 무상수리기간 완벽정리👩‍🔧]]></title>
            <link>https://velog.io/@d-x-eg/%ED%8F%B4%EB%93%9C-%EB%AC%B4%EC%83%81%EC%88%98%EB%A6%AC%EA%B8%B0%EA%B0%84-%EC%99%84%EB%B2%BD%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@d-x-eg/%ED%8F%B4%EB%93%9C-%EB%AC%B4%EC%83%81%EC%88%98%EB%A6%AC%EA%B8%B0%EA%B0%84-%EC%99%84%EB%B2%BD%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Fri, 14 Feb 2025 05:31:35 GMT</pubDate>
            <description><![CDATA[<h1 id="2025-02-13-삼성-서비스-센터-방문"><strong>2025-02-13</strong> 삼성 서비스 센터 방문</h1>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/322649bd-5b75-4411-be6b-810861546faf/image.png" alt=""></p>
<p>폴드에 대한 무상수리에 대해 완벽하게 정리해드립니다!</p>
<blockquote>
<p>폴드 서비스 기간은 최대 &#39;3년&#39;</p>
</blockquote>
<p>어떻게?? </p>
<h2 id="2년--무상수리-후-추가-1년">2년 + 무상수리 후 추가 1년</h2>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/c577aae1-1190-496a-8633-27f7b3c98066/image.png" alt=""></p>
<p>기준은 <strong>최초 통화일 예를 들어</strong> 최초 통화일이 <strong><code>2022년10월01</code></strong>일이면
무상수리 보증 기간은 <strong>2년</strong>인 <strong><code>2024년9월30일</code></strong>
만약 보증기간 중 수리를 받았아면 <strong><code>2024년05일 15일</code></strong> 무상수리 받음
추가적으로** 1년<strong>의 보증기간이 생긴다. **<code>2025년05월14일까지</code></strong>
만약 보증기간 기간이 연장된 <strong><code>2025년05월14일</code></strong>이 지나면 완전 끝난다.</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/36a80159-cfcc-46c4-b4d8-510c6fcf532c/image.png" alt=""></p>
<p>과실이 기계 결함이건 부주의던 상관없으 무조건** 유상수리**.. 된다..</p>
<blockquote>
<p>왜? 해주고 싶어도 전산에서 막혀 어쩔 수 없는 부분..
그러니.. 폴드 쓰시는분들은 기간 잘 확인하시구 꼭 받으세요...ㅜㅜ</p>
</blockquote>
<p>저는 <strong>22년</strong>에 사서 1년 지난 시점인 <strong><code>23년 10월</code></strong>에 올갈이 한번 했더니.. <strong><code>24년10월</code></strong>에 보증기간이 끝나서
<strong>70만원</strong>에 수리 해야 한다고 하더라구요.. 세상에.. 너모하자나... ㅜㅜ</p>
<p>2년 보증 기간인 24년에 올갈이 했더라면.. 25년 까지라 무상수리가 가능했을텐데... 정말 아쉽다ㅜㅜ</p>
<h2 id="꿀팁">꿀팁</h2>
<p>최대한 무료수리 기간인 2년 가까이 가서 한번 받고 1년 다될때 쯤에.. 한번 더 받자</p>
<p>그리고 </p>
<blockquote>
<p>많은 분들이 힌지에 기스 나면 안된다 라고 하는데 흠집 한두개 정도는 그냥 눈감아 준다고 하네요 </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[일하다보니 쓰면 편한 플러그인 추천]]></title>
            <link>https://velog.io/@d-x-eg/%EC%9D%BC%ED%95%98%EB%8B%A4%EB%B3%B4%EB%8B%88-%EC%93%B0%EB%A9%B4-%ED%8E%B8%ED%95%9C-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%B6%94%EC%B2%9C</link>
            <guid>https://velog.io/@d-x-eg/%EC%9D%BC%ED%95%98%EB%8B%A4%EB%B3%B4%EB%8B%88-%EC%93%B0%EB%A9%B4-%ED%8E%B8%ED%95%9C-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%B6%94%EC%B2%9C</guid>
            <pubDate>Tue, 11 Feb 2025 07:20:47 GMT</pubDate>
            <description><![CDATA[<p>웹 디자인을 하기 위해선 필수가 아닌 기본이라고 할 수 있는 <strong><code>figma</code></strong>
이회사 입사할때까지만 해도 아직 잘 쓰지 않은 아이였지만.. 세상에.. 점점 좋아지더니
지금은 필수..옆동네 XD도 사라지는 마당에.. 제발 무료는 그대로 있게 해주세요..</p>
<p>현재까지 피그마로 작업한 프로젝트를 15개이상..</p>
<p>어느정도 작업을 하다보니 자주쓰는 플러그인을 추천하려고 한다.
저번에는 협업 개발자에게 알려주면 좋은 플러그인이지만
오늘은 작업시 쓰기 좋은 것으로 나를 위한 플러그인이다 ㅎㅎ🎉</p>
<h2 id="1ghost🎈">1.Ghost🎈</h2>
<p>로딩중일때 주로 쓰며
스피너나 로더 같은 ui를 사용하거나, 예상할 수 있도록 사용한다.
만드는게 어려운건 아니지만 플러그인으로 업무질을 높여줄 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/49267892-d2bd-4e5d-91e9-84a26432c175/image.PNG" alt=""></p>
<blockquote>
<p>플러그인 한방으로 생기는 로딩 ui 진짜 잘썻다 물런 저거 하나만 있는건 아님</p>
</blockquote>
<h2 id="2-random-layout-generator🎈">2. Random layout generator🎈</h2>
<p>무한한 레이아웃을 무작위로 생성하는 플러그인
그냥 레이아웃 아이디어 참고용으로 사용하기 좋아서 올린다.
완전 꿀팁은 아니지만 한번씩 생각없이 보다가 좋은 배치가 나올 수 있기에 꿀팁에 넣었다 ㅎㅎ</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/f975656d-30b2-4f7a-94a1-d858d0d3fb6b/image.PNG" alt=""></p>
<blockquote>
<p>억지 같아 보이지만 진짜 생각보다 유용하게 쓸 수 있다.</p>
</blockquote>
<h2 id="3-figit---a-massive-library-of-ui-elements🎈">3. Figit - A massive library of UI Elements🎈</h2>
<p>천개 이상의 UI 레이아웃으로 시간을 절약할 수 있는 플러그인</p>
<p>참고용으로 유용하다.. 솔직히 나는 관공사 플랫폼 개발이라 일반, 쇼핑몰 페이지 만들데 좀 더 활용도가 높을 것 같다!
이용권 있지만 솔직히 잘 안된다는 말이 많아 그냥 참고용으로 종종 썼다. *<del>진짜 혹시나.. 사지말자</del></p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/9a7685e5-d2b1-433b-8d72-85182e94435a/image.PNG" alt=""></p>
<blockquote>
<p>정리하면서 다시보니 2년정도 업뎃은 멈춘듯..
레이아웃 및 배치에 많인 도움이 되었기에 꿀팁에 넣어본다!</p>
</blockquote>
<h2 id="4-iconify🎈">4. iconify🎈</h2>
<p>많은 아이콘이 다양하게 있어서 많이 사용 햇다.
라이브버리랑 유료 플랫폼 이용하면서 점점 안쓰지만 한번씩 들어가서 볼때가 있다.</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/dcb746d5-1643-4334-b84b-5b40e383750e/image.PNG" alt=""></p>
<blockquote>
<p>단점이 존재하는데.. stroke 조절이 되는지 안되는지 눌러봐야 알아서.. 한번씩 빡쳐서 그냥 내가 만든다.. ㅎㅎ &lt; 혹시 보는법 아시는분..?</p>
</blockquote>
<h2 id="5-unsplash🎈">5. Unsplash🎈.</h2>
<p>이건 진짜 이쁜 그림이 많아 억지로(시안용으로)라도 한번씩 쓰는데
우리회사 특성상 공기업이( 공장사진.. 기계사진.. , 등) 많아 이미지는 유료 다운 플랫폼을 이용한다.
하지만 한번씩 일반적인 페이지도 존재할때 시안용으로 한번씩 쓴다. &lt; 너무 좋당.
<img src="https://velog.velcdn.com/images/d-x-eg/post/caed4dc8-bc95-4777-a2ea-5b865055a0e6/image.PNG" alt=""></p>
<blockquote>
<p>사진 구도나 색감이 너무 예뻐서 색추출용으로 사용도 한다.</p>
</blockquote>
<h2 id="6design-lint🎈">6.Design Lint🎈</h2>
<p>반복된 작업과 수정을 하다보면 생각보다 많은 컴포넌트가 해제되고 순서가 틀어지는 경우가 많다.
프레임 내 누락된 스타일을 찾아주는 플러그인 이 아이를 쓰면 누락된 아이를 한번에 정리 할 수 있지만 동일하다는 조건에서 좋다!
그렇기 위해선 컴포넌트 정리는 필수! </p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/4aac518d-1c74-4179-a2ea-277be9accedb/image.PNG" alt=""></p>
<blockquote>
<p>천천히하면 필요없지만 상황에 따라 급한 경우 던진 정리용으로 최고다.</p>
</blockquote>
<h2 id="7outline">7.Outline</h2>
<p>디자인을 하다보면 자체적으로 간격을 확인 할 수있지만 그래도 하나하나 클릭하지 않아도 되기에 대부분 틀 완성하고 마무리, 전체 레이아웃 할때 종종 쓴다
수정을 하다보면 넣었다 빼면서 전체적인 패딩 마진이 달라질 때 있긴하다.. 진짜 정신없이 수정을 하다보면.... 
그럴때 너무 좋다 색별로 구분 되지만 솔직히 그냥 큰 간격만 하면 되기에 괜찮은것 같다 ㅎㅎ</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/1111b137-f293-4d68-b096-0b4e6672a49e/image.PNG" alt=""></p>
<blockquote>
<p>삭제는 좀 귀찮긴 하다...ㅎㅎ</p>
</blockquote>
<h2 id="8a11y---color-contrast-checker">8.A11y - Color Contrast Checker</h2>
<p>WCAG(웹 콘텐츠 접근성 지침) 표준을 준수하여 사용자가 텍스트를 읽을 수 있도록 도와주는 플러그인
처음 컬러값 잡을 때 쓰기 좋으면 확실하게는 사이트를 통해 확인해보자</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/fdf9772f-2d7c-4945-a44e-fc3f5cc2565f/image.PNG" alt=""></p>
<p>다양한 작업을 하다보면 조금더 편하게 할 수 없을까 하는 생각으로 6개월에 한번씩은 피그마 플러그인 검색을 해보는거 같다.
신입에 쓰면 좋을까 싶어 놔둿던 플러그인도 일단 같이 올려보겠다!</p>
<h2 id="99그외">99.그외</h2>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/85bdaa57-709c-490d-976f-7390e7ebd76d/image.PNG" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[figma 3년차가 알려주는 개발자와 협업시 3가지 플러그인 추천🤝]]></title>
            <link>https://velog.io/@d-x-eg/figma-3%EB%85%84%EC%B0%A8-%EA%BF%80%ED%8C%81</link>
            <guid>https://velog.io/@d-x-eg/figma-3%EB%85%84%EC%B0%A8-%EA%BF%80%ED%8C%81</guid>
            <pubDate>Fri, 07 Feb 2025 04:51:44 GMT</pubDate>
            <description><![CDATA[<p>오늘 갑자기 업무가 붕뜨게 되면서 피그마 관련 공부를 하고 있다가 타 부서 협업 처음 맡게 되었을때 있었던 파일 발견하면서 
에피소드 공개(북흐)하면서 꿀팁까지 알려주려고 한다.</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/7da44993-e90b-4b52-99a2-75c4a1b3cc81/image.PNG" alt=""></p>
<p>원래는 디자인(초큼의 기획) &gt; 퍼블리싱 &gt; 프론트 살짝쿵 까지 완료 후 개발자에게 넘기지만
한번씩 다른 부서의 프로젝트에 웹디자인만 맡아 해주는 경우가 종종 있다.</p>
<blockquote>
<p>&#39;증말 바쁠때는 눈물난다..ㅜㅜ&#39;</p>
</blockquote>
<p>매일 부딪히는 개발자(바로 옆자리 뒷자리 등등) 은 경우 바로 바로 소통이 가능하고 3년째 합을 맞추고 있어 다른 설명 없이 국룰?적으로 셋팅해놓으면 뽑아쓰는 형식으로 큰 어려움이 없었다.
하지만.. 다른 부서는 초반에 엄청 많이 삐걱 거렸다.. 
<img src="https://velog.velcdn.com/images/d-x-eg/post/02bbf24b-c76a-45fa-9eec-14c4a54cc44b/image.png" alt=""><img src="https://velog.velcdn.com/images/d-x-eg/post/42f124dc-b024-4825-bc3c-de373356e206/image.png" alt=""></p>
<p>어우 야.. 생각만 해도 아찔 했던 경험이였다..
또한 처음에는 하나하나 설명해줘야햇다.
<img src="https://velog.velcdn.com/images/d-x-eg/post/e8a3f160-daee-4b1b-9d41-438d324d82ab/image.PNG" alt=""></p>
<p>항상 코딩까지 해서 줬던 부분이라 생각지 못한.. 괭좡히 미흡했던 부분이기도 했다.&gt;//&lt;
심지어 피그마를 처음 해봐서 잘 하지도 못하고 버벅이던.. 그래서 어떻게 해줬는가..
아래 플러그인을 협업 개발자에게 알려주며 빠른 업무를 할 수 있도록 도와주자..
슬픈건 플러그인 깔고 어떤식으로 쓰는지 알려줘야한다^_^</p>
<blockquote>
<p>※아래에 나오는 시안은 초기 시안이며, 이미지는 실제 공장 내부 사진이 아닌 유료 이미지 입니다. </p>
</blockquote>
<h2 id="1spectral">1.Spectral<img src="https://velog.velcdn.com/images/d-x-eg/post/f8e17230-50ac-4435-a05d-27f3965467aa/image.PNG" alt=""></h2>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/7fd51f28-f581-4607-ac52-c4237fd0cd3e/image.PNG" alt=""><img src="https://velog.velcdn.com/images/d-x-eg/post/217eee2e-9d88-46cc-805b-25df826c14a0/image.PNG" alt=""></p>
<p>새로 디자인한 부분의 규격, 크기, 색상과 스타일, 등 인터랙션은 어떤지 상세하게 적은 필수..
이걸 알기 전과 예시화면.. 수줍구나..ㅜㅜ
이전에는 일일이 손으로 적었지만, Spectral 플러그인을 사용하면 선택한 부분의 모든 디자인 정보를 한 번에 정리해 보여준다.
단점은 한 섹센 클릭시 한번에 나와서 약간 헷갈릴 수 있다는거?? </p>
<h2 id="2dimensions">2.Dimensions</h2>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/53192c77-8f9a-404c-8034-48990705781b/image.PNG" alt=""></p>
<p>요소 간격 표기 폰트 개발자가 직접 하나하나 확인해야하는 단점이 있지만 훨 직관적이라 현재는 <strong><code>Dimensions</code></strong> 쓰고 있다.
컬러를 보려면 2개 이상의 요소가 겹쳐 있으면 안되니 컬러는 아래 플러그인을 추천한다.</p>
<h2 id="3color-extractly">3.Color Extractly</h2>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/51798522-a128-4b89-9cb3-a252e25fb517/image.PNG" alt=""></p>
<p>즉각적으로 색상 추출을 할 수 있으며 쉽게 보여진다.
단점은 직관적으로 네임 설정을 해야 보기 편하며 하나 하나 설정을 해야 한다.</p>
<p>위에 3가지만 있으면 별로의 정리 없이 한번에 전달 할 수 있다.</p>
<p>여기서 제일 중요한건 <del><strong>혼자만 알 고 있으면 안된다.</strong></del>
무슨말이냐 당연히 알고 있을꺼라 생각하면 안되고 무조건 설명, 주석은 필수
나에게 스크롤은 컨텐츠가 넘어가면 당연한 스크롤이지만
표시를 하지 않으면 어디부터 어디까지 스크롤 영역인지 조차 상대방은 알 수 없다.
그러니 꼭 디테일하고 상세하게! 설명을 써놓자!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA['npm'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.📢]]></title>
            <link>https://velog.io/@d-x-eg/npm%EC%9D%80%EB%8A%94-%EB%82%B4%EB%B6%80-%EB%98%90%EB%8A%94-%EC%99%B8%EB%B6%80-%EB%AA%85%EB%A0%B9-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%98%90%EB%8A%94%EB%B0%B0%EC%B9%98-%ED%8C%8C%EC%9D%BC%EC%9D%B4-%EC%95%84%EB%8B%99%EB%8B%88%EB%8B%A4</link>
            <guid>https://velog.io/@d-x-eg/npm%EC%9D%80%EB%8A%94-%EB%82%B4%EB%B6%80-%EB%98%90%EB%8A%94-%EC%99%B8%EB%B6%80-%EB%AA%85%EB%A0%B9-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%98%90%EB%8A%94%EB%B0%B0%EC%B9%98-%ED%8C%8C%EC%9D%BC%EC%9D%B4-%EC%95%84%EB%8B%99%EB%8B%88%EB%8B%A4</guid>
            <pubDate>Tue, 04 Feb 2025 00:34:25 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/d-x-eg/post/337bfd49-0a4e-4938-8583-fd65594c2070/image.png" alt=""></p>
<p>어느때 다름없이 코딩을 하려고 start를 했는데
엥?? 갑자기 ?</p>
<blockquote>
<p>&#39;npm&#39;은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/0d74ab0f-1c26-4ba9-8417-dd07cd4e6ab4/image.png" alt=""></p>
<p>?? 아게 무슨일이람?? </p>
<p>검색해보니 VSCode의 기본 터미널이 powershell로 설정되어 있기 때문이라고 해서 
기본 터미널 종류를 바꿔줬다.</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/e8499606-92d7-4942-b7bd-66100b52a180/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/c6c1c8af-0b8b-4123-beab-b87c7f54b242/image.png" alt=""></p>
<p>그리고 터미널 닫았다가 다시 실행하면 된다는데..
엥?? 난안됨..;; 왜안되지? 
다시 검색을 시작.. </p>
<p>갑분 노드가 잘 깔려있는지 확인하라고..?? 
cmd를 키고 node -v을 검색 해보니.. </p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/f812a435-4adb-4eb8-b6bc-58c825d21bf3/image.png" alt=""></p>
<p>오?  어디갓어..? 우리 노드 어디간거지..?</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/2f628dc6-85c2-41f5-a39e-97cdfcb73577/image.png" alt=""></p>
<p>파일 폴더 안에는 노드가 있는데 이게 무슨일인가..?
무슨 다시 셋팅해주니</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/cd498b50-e75b-40a0-b90f-feb33ebbdc7e/image.png" alt=""></p>
<p>와우 20대에서 22로 올랏넹,..</p>
<p>그러고 vs자체를 껐다 키고 터미널 제거후 새로 실행하니 
<img src="https://velog.velcdn.com/images/d-x-eg/post/408ccdfc-a1e3-447d-826a-9579098478d0/image.png" alt="">
얏호 ~ 바로 된당.. </p>
<p>잘 되던 노드가 왜 사라지는건지는 다음에 또 그러면 확실하게 알아봐야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Components😎 and Props🕶 실습]]></title>
            <link>https://velog.io/@d-x-eg/Components-and-Props-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@d-x-eg/Components-and-Props-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Wed, 22 Jan 2025 07:26:25 GMT</pubDate>
            <description><![CDATA[<p>구구절절 설명하는것도 좋지만 실습 한번이 이해가 제일 빠른것 같아서 공부한
실습을 올리려고 한다.</p>
<p>간단한 댓글 컴포넌트를 만들어 실습해보자!
일단 <strong>Counter</strong>, <strong>CommentList</strong> 페이지를 생성한다. </p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/d67ed440-c3da-4cce-9e02-9ad489a1a67a/image.png" alt=""></p>
<p><strong>Counter</strong> 페이지에서는 아래와 같이 생성 </p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/3a13b5ae-5edd-417a-bd9d-b726c9e72e7a/image.png" alt=""></p>
<p><strong>CommentList</strong> 페이지에서는 아래와 같이 <strong>Counter</strong> 불러온다.</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/38e1fc00-8573-4645-ac52-6510d447be0f/image.png" alt=""></p>
<p><strong>index.js</strong>에 <strong>CommentList를</strong> 넣고 실행하면</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/d8e46fd3-1af9-4a2b-865e-fab6f5cdb8a3/image.png" alt=""></p>
<p>아주 잘 받아 나온다.</p>
<p>간단하게 약간의 스타이링을 추가하면 
<img src="https://velog.velcdn.com/images/d-x-eg/post/523d1282-d813-49c4-a744-1196ea44de0b/image.png" alt=""></p>
<p>아주 잘 만들어진 화면을 확인 할 수 있다.</p>
<p>하지만 이건 직접 코드에 넣은것이고 </p>
<p>동적으로 받아오기 위해 <strong><code>props</code></strong>를 추가한다.
<img src="https://velog.velcdn.com/images/d-x-eg/post/f88e6cc7-6fce-4fc7-b9ef-dd4ceded2d7b/image.png" alt=""></p>
<p>아직 <strong><code>name</code></strong>과 <strong><code>comment</code></strong>가 정의 되지 않아 아무것도 나오지 않는다.</p>
<p><strong>CommentList</strong>로 가 <strong>Comment</strong>에 <strong><code>props</code></strong> <strong><code>name</code></strong>, <strong><code>comment</code></strong>을 정의해주면 
아래 사진처럼 잘 나오는게 확인된다.</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/b027de6a-b91a-4387-91c2-567ff2b9340c/image.png" alt="">
여기서 <strong>Commnet</strong>를 하나 더 추가해보면 </p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/c75fb209-7056-4f7e-bdc1-f6612f49d01c/image.png" alt=""></p>
<p>아주 잘 받아 오는걸 알수 있다
그럼 각 별도의 객체로 분리하여 동적으로 받아오게 만든다면?</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/1050a5b1-3074-4ce9-874b-179171d7d8be/image.png" alt=""></p>
<p><strong>JavaScript</strong> 배열의 <strong>map</strong>함수를 써서 각 댓글 객체에 대해 <strong>comment</strong> 컴포넌트를 <strong>return</strong>하게 작성한다.</p>
<p>배열 내 있는 수만큼 커멘드가 렌더링 된걸 볼 수 있다.</p>
<p>오늘도 하나의 지식이 쌓여가는 나를 칭찬한다.. 후후</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Component?🚀]]></title>
            <link>https://velog.io/@d-x-eg/Component%EB%9E%80</link>
            <guid>https://velog.io/@d-x-eg/Component%EB%9E%80</guid>
            <pubDate>Wed, 22 Jan 2025 05:19:42 GMT</pubDate>
            <description><![CDATA[<p><strong>Component</strong> 기반의 구조이며, 모든 페이지가 <strong>Component</strong> 구성되어 있고 하나의 <strong>Component</strong> 또 다른 여러 개의 <strong>Component</strong> 조합으로 구성될 수 있다.
이러한 Component들을 마치 레고 블록을 조립하듯 끼워 맞춰 새로운 <strong>Component</strong> 만들 수 있다.
 <strong>Component</strong> : 입력(<strong><code>props</code></strong>)을 받아 출력(<strong><code>Element</code></strong>) 하는 역할
 
React Component는 크게 <del><strong>두 가지</strong></del> 방식으로 작성한다.</p>
<blockquote>
<p>함수형 컴포넌트 (Function Component)
클래스형 컴포넌트 (Class Component)</p>
</blockquote>
<p><strong>※현재는 함수형을 많이 쓰지만 그래도 클래스가 무엇인지는 알고 있어야 하니 같이 작성한다.</strong></p>
<h1 id="1-🛬클래스형-컴포넌트-class-component">1. 🛬클래스형 컴포넌트 (Class Component)</h1>
<p>클래스형 컴포넌트 <strong><code>Class Component</code></strong>
React의 초기 버전에서 사용되던 컴포넌트 작성 방법
ES6 클래스 문법을 사용하여 컴포넌트를 정의하고, React에서 제공하는 render() 메서드를 통해 UI를 렌더링 한다.
장점으로는 상태(state)와 생명주기 메서드를 사용할 수 있다.
하지만 React 16.8에서 훅(Hooks)이 도입된 이후로 함수형 컴포넌트(Function <strong><code>Component</code></strong>가 주로 사용된다.
예전 코드나 라이브러리에서는 클래스형 컴포넌트는 아직 사용되고 있으니 간단하게 이해는 하는게 좋을 것 같다.</p>
<h2 id="특징">특징</h2>
<ul>
<li>상태 관리: 클래스형 컴포넌트는 <strong><code>this.state</code></strong>를 사용 상태를 관리</li>
<li>생명주기 메서드: 클래스형 컴포넌트에서는 컴포넌트의 생명주기(마운트, 언마운트, 업데이트 등)를 관리할 수 있는 여러 생명주기 메서드를 사용할 수 있다.</li>
<li><strong><code>render()</code></strong> 메서드: React.Component의 하위 class에서 반드시 정의해야 하는 메서드</li>
<li>고정적: 컴포넌트 클래스를 선언하는게 아닌 합성을 주로 사용합</li>
</ul>
<p>상태 관리 (<strong><code>this.state</code></strong>와 <strong><code>this.setState</code></strong>)
상태를 관리하려면, 클래스의 생성자(constructor)에서 <strong><code>this.state</code></strong>를 초기화하고, 상태를 변경할 때는 <strong><code>this.setState()</code></strong> 메서드를 사용
<img src="https://velog.velcdn.com/images/d-x-eg/post/06365321-3e6a-4934-9f19-efc761d6931d/image.png" alt=""></p>
<ul>
<li><strong><code>this.state</code></strong>는 컴포넌트의 상태고 <strong><code>this.setState()</code></strong>를 사용하여 상태를 변경된다.</li>
<li><strong><code>setState()</code></strong>는 상태가 변경될 때마다 컴포넌트를 리렌더링 된다.</li>
</ul>
<hr>
<h1 id="2-🛫함수형-컴포넌트-function-component">2. 🛫함수형 컴포넌트 (Function Component)</h1>
<p>React 16.8부터 Hooks가 도입되면서 함수형 컴포넌트가 주로 사용된다.
상태(state)나 생명주기 메서드(lifecycle methods)를 다루기 위해 useState, useEffect 등의 훅을 사용있다.
이 방식은 JavaScript 함수로 작성 UI를 반환하는 간단한 구조를 가지고 있다.
React 16.8이전에는 클래스형 컴포넌트가 사용되었지만, 현재는 함수형 컴포넌트가 훨씬 더 선호되고 있다.</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/701b7a92-fdcf-4b37-b852-7a175b5f6a4c/image.png" alt=""></p>
<h2 id="특징-1">특징</h2>
<p><strong>1)단순함:</strong> 함수형이 클래스형보다 읽시 쉽고 간결
<strong>2)상태와 이펙트 관리:</strong> <strong><code>useState</code></strong>, <strong><code>useEffect</code></strong>와 같은 React 훅(Hook)을 사용하여 상태 관리와 생명주기 관리
<strong>3)컴포넌트 재사용성</strong> 함수형 컴포넌트는 다른 함수나 컴포넌트와 쉽게 결합 및 재사용에 용이</p>
<h2 id="장점">장점</h2>
<p><strong>간결성:</strong> 코드가 간결하고 읽기 쉬우며, 시간 단축 및 유지보수가 용이.
<strong>성능:</strong> 함수형 컴포넌트를 최적화
<strong>Hooks를 통한 기능 확장:</strong> <strong><code>useState</code></strong>, <strong><code>useEffect</code></strong>, <strong><code>useContext</code></strong>, <strong><code>useReducer</code></strong> 등 다양한 훅을 통해 상태 관리, 사이드 이펙트 처리, 데이터 공유, 등 처리 가능</p>
<p>Hooks에 대해 자세히 알고 싶으면 아래 참고</p>
<hr>
<h1 id="💺component-주의사항">💺Component 주의사항</h1>
<h2 id="1이름규칙">1.이름규칙</h2>
<ul>
<li>소문자로 시작하는것은 컴포넌트를 DOM태그로 인식하기 떄문에 항상 대문자로 시작</li>
</ul>
<p><strong>소문자로 시작하면 html div 태그로 인식</strong></p>
<pre><code>const element = &lt;div/&gt;;</code></pre><p><strong>Welcome 이라는 컴포넌트를 사용자가 정의  대문자로 하여금 리액트 Component로 인식</strong></p>
<pre><code>cosnt element = &lt;Welcome name=&quot;홍길동&quot;/&gt;</code></pre><h2 id="2jsx-내-중괄호-사용">2.JSX 내 중괄호{} 사용</h2>
<ul>
<li>JavaScript 코드 변수나 함수를 사용하려면 중괄호 {}를 사용</li>
</ul>
<pre><code>const name = &#39;mini&#39;;
return &lt;h1&gt;Hello, {name}!&lt;/h1&gt;;  // &quot;Hello, mini&quot; 출력</code></pre><h2 id="3상태state-변경은-비동기적">3.상태(state) 변경은 비동기적</h2>
<ul>
<li>상태가 즉시 변경되지 않으므로 상태 변경 후 바로 상태를 읽을 때는 예상한 값이 아닐 수 있다.</li>
<li>상태 변경을 연속적으로 할 때는 <strong>함수형 setState</strong>를 사용한다.</li>
</ul>
<h2 id="4컴포넌트는-단일">4.컴포넌트는 단일</h2>
<ul>
<li>순수 함수형 컴포넌트는 입력값(props)에 의해서만 결정된 출력값(JSX)을 반환
컴포넌트 내에서 직접 상태를 변경하거나 외부에 의존적인 값을 변경하면 안된다.
예를 들어, 컴포넌트 내에서 외부 변수나 API 호출을 직접 다룬다면, 이는 컴포넌트가 순수하지 않게 되어 결과적으로 애플리케이션의 상태 관리가 복잡해질 수 있다.</li>
</ul>
<h2 id="5렌더링-최적화">5.렌더링 최적화</h2>
<ul>
<li>상태나 props가 변경될 때마다 자동으로 리렌더링을 한다. (불필요한 리렌더링을 피하는 것이 중요)</li>
</ul>
<h2 id="6props는-읽기-전용">6.Props는 읽기 전용</h2>
<ul>
<li><strong><code>props</code></strong>는 부모 컴포넌트에서 전달된 값이므로, 자식 컴포넌트에서 직접 수정하면 안된다.</li>
<li><em><code>props</code>*</em>를 수정하려면 부모 컴포넌트에서 상태를 변경하고, 그에 따라 자식 컴포넌트가 변경된 props를 받도록 해야 한다.</li>
</ul>
<h2 id="7리스트-렌더링-시-key-사용">7.리스트 렌더링 시 key 사용</h2>
<ul>
<li>리스트 항목을 렌더링할 때는 각 항목에 고유한 key 값을 지정</li>
<li>key가 없으면 리렌더링 시 React가 각 항목을 재구성하는 데 불필요한 비용이 발생</li>
</ul>
<h2 id="8불변성-유지">8.불변성 유지</h2>
<p><em>상태나 props는 불변이어야 합니다. 즉, 객체나 배열의 상태를 직접 수정하는 것이 아니라 새로운 객체나 배열을 만들어야 합니다. 
상태를 배열로 다룰 때 *</em><code>push()</code>** 대신 <strong>concat()</strong>을 사용해야 한다. 상태가 직접 변경되면 변화를 감지하지 못할 수 있기떄문</p>
<pre><code>// 불변성 위반 (잘못된)
this.state.items.push(newItem);

// 불변성 유지 (올바른)
this.setState({ items: [...this.state.items, newItem] });</code></pre><h1 id="🚀결론">🚀결론</h1>
<p>React 컴포넌트를 작성할 때 위와 같은 주의사항들을 지키는 것이 중요하며, 이를 통해 성능 최적화, 코드의 유지보수성 향상, 에러 방지 등을 할 수 있다.
컴포넌트를 잘 구조화하고 관리하는 것이 핵심!</p>
<ul>
<li>기능 단위로 재사용 가능한 단위로 작성하는게 제일 좋다.</li>
<li>재사용 컴포넌트가 많을 수록 개발 속도가 빨라진다.</li>
</ul>
<p style="ont-size: 13px;
    word-break: break-word;
    padding-top: 10px;
    min-height: 20px;
    caption-side: bottom;
    text-align: center;color:#777;"

<blockquote>
</blockquote>
<pre><code>※ 본 포스팅은 인프런 강의와 리액트 페이지를 보며 정리한 내용입니다.
&lt;/p&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[useState❓]]></title>
            <link>https://velog.io/@d-x-eg/useState</link>
            <guid>https://velog.io/@d-x-eg/useState</guid>
            <pubDate>Tue, 21 Jan 2025 08:30:00 GMT</pubDate>
            <description><![CDATA[<h2 id="usestate">useState</h2>
<p>함수형 컴포넌트 내에서 <strong>상태(state)</strong>를 관리할 수 있게 해주는 Hook!
클래스형 컴포넌트에서 <strong><code>this.state</code></strong>와 <strong><code>this.setState</code></strong>를 사용하여 상태를 관리하는 것과 같은 기능을 제공하지만, 함수형 컴포넌트에서 더 간단하고 직관적인 방식으로 상태를 관리할 수 있다.</p>
<hr>
<h3 id="설명">설명</h3>
<p><strong>useState</strong>(초기값)은 <strong>상태 변수</strong>(num)와 <strong>상태 업데이트 함수</strong>(setNomber)를 반환
<strong><code>num</code></strong>: 상태 변수로, 컴포넌트 내에서 관리되는 값입니다.
<strong><code>setNomber</code></strong>: 상태를 변경하는 함수로, 이 함수를 호출하여 num 값을 업데이트합니다.
<strong><code>useState</code></strong>의 매개변수로 전달되는 값은 상태의 초기값입니다. 위 예제에서는 0을 초기값으로 설정</p>
<h3 id="비동기성">비동기성</h3>
<p><strong><code>setState</code></strong>처럼 <strong><code>useState</code></strong>로 업데이트된 상태는 비동기적 즉, 상태 업데이트가 바로 반영되지 않고, React가 리렌더링 후에 새로운 상태 값을 적용한다. </p>
<h4 id="예시">예시</h4>
<p>기본 셋팅은 아래와 같다.</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/3d8b768c-05d8-4284-a6dc-23e9b1952302/image.PNG" alt=""></p>
<p><strong>import React, {useState} from &quot;react&quot;;</strong>
상단에 <strong><code>useState</code></strong>를 추가해준다함수기에 {} 안에 작성</p>
<p><strong>const [num,setNomber]= useState(0);</strong> 를 셋팅
<strong><code>num</code></strong>은 0이라는 기본값을 가지는 변수며, <strong>const num = 0</strong>  &lt;&lt; 와 동일
<strong><code>setNomber</code></strong>는 세트 함수이며, 0이라는 초기값을 <strong><code>num</code></strong>에 넣고 이 값을 변경시키기 위해 <strong><code>setNomber</code></strong>를 넣어준다.</p>
<pre><code>const Counter = ()=&gt; {
    const [num,setNomber]= useState(0);
    return(
        &lt;div&gt;
            &lt;button&gt;+1&lt;/button&gt; // 증가버튼
            &lt;button&gt;-1&lt;/button&gt; // 감소버튼
            &lt;p&gt;&lt;/p&gt; // 숫자 표시
        &lt;/div&gt;
    )
}
</code></pre><p>클릭시 실행할 함수인 plus 를 넣어주고 
const plus = ()=&gt; {
    setNomber(num+1);
        //0 = num + 1 과 동일하다.
    }</p>
<p>버튼에 호출할 함수를 셋팅</p>
<pre><code>&lt;button onClick={plus}&gt;+1&lt;/button&gt;</code></pre><p>💥 react 에서는onClick  꼭 대문자를 써야한다.</p>
<pre><code>
    return(
        &lt;div&gt;
            &lt;button onClick={plus}&gt;+1&lt;/button&gt;
            &lt;button&gt;-1&lt;/button&gt;
            &lt;p&gt;{num}&lt;/p&gt; // &lt;&lt; 여기에 변수인 num를 넣어준다. 
        &lt;/div&gt;
    )</code></pre><p>감소도 동일하게 해주면 <strong>완성된 코드</strong>는 
<img src="https://velog.velcdn.com/images/d-x-eg/post/be27d1e4-5aed-4027-a21e-94ef2650b754/image.png" alt=""></p>
<pre><code>import React, {useState} from &quot;react&quot;; //1.먼저 호출

const Counter = ()=&gt; { 
    const [num,setNomber]= useState(0); //2.num변수를 선언하고 setNomber셋함수 셋팅
    const plus = ()=&gt; {
        setNomber(num + 1); // 3. 버튼을 누르면 num변수에 1씩  증가
    }
    const minus = ()=&gt; {
        setNomber(num - 1);// 4. 버튼을 누르면 num변수에 1씩 감소
    }
    return(
        &lt;div&gt;
            &lt;button onClick={plus}&gt;+1&lt;/button&gt; // 증가 함수 넣고
            &lt;button onClick={minus}&gt;-1&lt;/button&gt; // 감소 함수 넣고
            &lt;p&gt;{num}&lt;/p&gt; // 보여줄 변수까지 넣어준다.
        &lt;/div&gt;
    )
}

export default Counter; // 마지막 불러와주면.
</code></pre><p>기본인 0에서 
<img src="https://velog.velcdn.com/images/d-x-eg/post/f3a073fe-003a-4e36-bae9-1ec1acdbe133/image.png" alt=""></p>
<p>증가를 누르면
<img src="https://velog.velcdn.com/images/d-x-eg/post/a09a7913-6204-40ea-ba42-3d7d4ce0c54d/image.png" alt="">
감소를 누르면 (2번눌러봄)
<img src="https://velog.velcdn.com/images/d-x-eg/post/f2daf453-598c-40f4-8424-c892e7f043fd/image.png" alt=""></p>
<p>이쁘게 완성된 아이를 볼 수 있다.</p>
<hr>
<h2 id="정리">정리</h2>
<p>리액트에서 동적인 값을 관리할때 <strong>1useState1</strong>를 사용한다.
[<strong>변수명</strong>,<strong>set함수</strong>]= <strong>useState</strong>(초기값);</p>
<ol>
<li>초기값 변수명을 선언하고 </li>
<li>두번째 배열에서 변수에 대한 세트 함수 셋팅한다.</li>
<li>셋함수를 통해서 변경을 해야 상태 관리가 되며 그 값이 동적으로 값이 반영이 된다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Hook🥊]]></title>
            <link>https://velog.io/@d-x-eg/Hook</link>
            <guid>https://velog.io/@d-x-eg/Hook</guid>
            <pubDate>Tue, 21 Jan 2025 07:12:02 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/d-x-eg/post/4fed6dc6-8800-41bd-98a0-14ac53ef25da/image.png" alt=""></p>
<p>오늘 복습하다 생각해보니 제일 중요한 hook에 대해 다루지 않은것 같아
부랴부랴 정리해서 올리게 되었다.
이런.. 리액트 ,, 훅 너란 녀석.. </p>
<h1 id="hook-이란">Hook 이란?</h1>
<p>함수형 컴포넌트 내에서 상태(state), 부수 효과(side effect), 생명주기 메서드 등을 관리할 수 있게 해주는 특별한 함수이며 React 16.8 버전에 도입 되었다.
기존 클래스형에 있는 기능들을 함수형 컴포넌트에도 사용할 수 있는게 바로 Hook!</p>
<h1 id="hook-특징">Hook 특징</h1>
<p><strong>1)상태 관리</strong>
<strong><code>useState</code></strong>를 사용하여 함수형 컴포넌트 내에서 상태를 관리할 수 있다.</p>
<p><strong>2)부수 효과 처리</strong>
<strong><code>useEffect</code></strong>를 사용하여 컴포넌트의 생명주기 이벤트(마운트, 업데이트, 언마운트)에 맞춰 부수 효과를 처리할 수 있다.
<strong>3)컴포넌트 간 로직 재사용</strong>
<strong><code>useContext</code></strong>, <strong><code>useReducer</code></strong>, <strong><code>useMemo</code></strong>, <strong><code>useCallback</code></strong>과 같은 Hook을 사용하여 로직을 관리하고, 커스텀 Hook을 통해 로직을 재사용할 수 있다.
<strong>그밖에</strong>
<strong><code>useCallback</code></strong>, <strong><code>useMemo</code></strong>와 같은 Hook을 사용하면 불필요한 렌더링을 방지, 성능을 최적화 <strong><code>useMemo</code></strong>는 값 계산을 캐시하고, <strong><code>useCallback</code></strong>은 함수 인스턴스를 재사용 할 수 있게 한다.</p>
<h1 id="장점-3가지">장점 3가지</h1>
<blockquote>
</blockquote>
<ul>
<li><p>간결한 코드 💨 간단한 함수형 코드 대체</p>
</li>
<li><p>로직 재사용성 💨 커스텀으로 여러 컴포넌트 로직 재사용</p>
</li>
<li><p>함수형프로그래밍 💨 간단한 방식으로 코드 작성</p>
<hr>
</li>
</ul>
<h2 id="1usestate">1.useState</h2>
<p>상태 변수와 상태 업데이트 함수를 반환 컴포넌트에서 상태를 관리</p>
<pre><code>const [count, setCount] = useState(0);</code></pre><p><strong>count</strong>: 상태 변수
<strong>setCount</strong>: 상태를 업데이트하는 함수
<strong>0</strong>: 상태의 초기값</p>
<p>자세한 설명은 <a href="https://velog.io/@d-x-eg/useState">여기</a> </p>
<h2 id="2useeffect">2.useEffect</h2>
<p>컴포넌트가 렌더링된 후에 특정 작업을 수행할 수 있게 함</p>
<pre><code>useEffect(() =&gt; {
  // 이곳에 실행할 작업을 작성
  document.title = `You clicked ${count} times`;
}, [count]);
</code></pre><ul>
<li><strong><code>useEffect</code></strong>는 렌더링 후마다 실행, 두 번째 인자에 전달된 배열 [count]에 지정된 값이 변경될 때만 실행 예)API호출, 이벤트 리스너 등록, 등 </li>
</ul>
<h2 id="3usecontext">3.useContext</h2>
<p>Context API와 함께 사용하여 컴포넌트 트리 내에서 데이터를 쉽게 전달</p>
<pre><code>const value = useContext(MyContext);</code></pre><ul>
<li>MyContext: 전달하고 싶은 데이터를 포함하는 Context 객체</li>
</ul>
<h2 id="4usereducer">4.useReducer</h2>
<p><strong><code>useState</code></strong>와 비슷하지만, 복잡한 상태 업데이트 로직을 처리할 때 유용 <strong><code>useState</code></strong>보다 강력한 관리</p>
<pre><code>const [state, dispatch] = useReducer(reducer, initialState);</code></pre><h2 id="5usecallback">5.useCallback</h2>
<p>함수가 렌더링될 때마다 새로 생성되는 것을 방지하고, 성능 최적화를 위해 특정 함수의 인스턴스를 재사용</p>
<pre><code>const memoizedCallback = useCallback(() =&gt; {
  // function body
}, [dependencies]);</code></pre><h2 id="6usememo">6.useMemo</h2>
<p>값이 변경될 때만 계산된 값을 반환하여 불필요한 렌더링을 방지 <strong><code>useCallback</code></strong>와 비슷</p>
<pre><code>const memoizedValue = useMemo(() =&gt; computeExpensiveValue(a, b), [a, b]);
</code></pre><h2 id="7useref">7.useRef</h2>
<p>컴포넌트 내에서 DOM에 접근하거나, 값이 변경되어도 리렌더링되지 않는다.</p>
<pre><code>const inputRef = useRef(null);
</code></pre><h1 id="hook-규칙">Hook 규칙</h1>
<p><strong>최상위에서 호출</strong>
컴포넌트 함수의 최상위에서만 호출되어야 합니다. 조건문이나 반복문 안에서 호출 불가</p>
<p><strong>React 함수형 컴포넌트 안에서 호출</strong>
React 컴포넌트 함수 안에서만 사용해야 하며, 일반 JavaScript 함수나 클래스 안에서는 사용할 수 없다.</p>
<h1 id="결론">결론</h1>
<p><strong><code>Hook</code></strong>은 React에서 함수형 컴포넌트가 클래스형 컴포넌트의 <strong>기능을 대체</strong>하고, 더 간결하고 <strong>효율적인 코드</strong>를 작성할 수 있도록 돕는 중요한 <strong>기능</strong>이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[useContext(...)' as it is null 에러]]></title>
            <link>https://velog.io/@d-x-eg/useContext...-as-it-is-null-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@d-x-eg/useContext...-as-it-is-null-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Tue, 21 Jan 2025 06:00:59 GMT</pubDate>
            <description><![CDATA[<h2 id="🤯에러">🤯에러</h2>
<p>Cannot destructure property &#39;basename&#39; of &#39;react__WEBPACK_IMPORTED_MODULE_0__.useContext(...)&#39; as it is null.</p>
<p>라우터를 하다가 생긴 에러..
어머.. 이건 뭐래.. </p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/c18776b6-750c-4789-9041-1e0d9aa1d839/image.PNG" alt=""></p>
<p>복습 하는 과정에서 처음 보는 에러.. </p>
<p>이런적은 처음이야.. ㄷㄷ 
검색해보니</p>
<p><a href="https://stackoverflow.com/questions/75728532/error-message-uncaught-typeerror-cannot-destructure-property-basename-of-re">검색 확인</a></p>
<p><strong>이유는?</strong></p>
<blockquote>
<p>link태그를 사용하는 컴포넌트가 라우터로 감싸져 있지 않아 생긴 문제..</p>
</blockquote>
<p>혹시나 하고 본 index.js 에는 역시나..</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/ef0357cf-ec51-4a99-abe7-91733a91d00a/image.png" alt=""></p>
<p>불러만 놓고 감싸놓진 않았구나~</p>
<h2 id="🤗해결">🤗해결</h2>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/a67461a5-1589-4603-befd-039f359d92cb/image.PNG" alt=""></p>
<pre><code>    &lt;React.StrictMode&gt;
        &lt;BrowserRouter&gt;
            &lt;App/&gt;
        &lt;/BrowserRouter&gt;
    &lt;/React.StrictMode&gt;</code></pre><p>오케이~ 감싸자 마자 바로 나오기~ 
리액트를 해봤다고 만만하게 봤다가 새로운 오류를 발견하게 되었다..
어찌 보면 실수이겠지.. 그래도 이렇게 알게 되었으니 다시는 반복하지 않으면 될 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ Can't resolve 'web-vitals' 에러]]></title>
            <link>https://velog.io/@d-x-eg/Cant-resolve-web-vitals-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@d-x-eg/Cant-resolve-web-vitals-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Mon, 20 Jan 2025 07:25:24 GMT</pubDate>
            <description><![CDATA[<p>오랜만에 만져보는 react🎉
새로 만들기 위해 셋팅하는중 
처음 보는 에러가 떴다.😕</p>
<h2 id="😱에러">😱에러</h2>
<p><strong>Error: Can&#39;t resolve &#39;web-vitals&#39; in &#39;C:\Users\ymku\min_app\src 어쩌구..</strong></p>
<p>흠.. 이게 무엇인고 하니 </p>
<p>새로운 라이브러리들을 다운받을 떄 종종 나는 오류인것 같다..
<strong>web-vitals</strong> 모듈이 설치 하면 되는 간단한 문제였고
<strong>npm create react-app</strong>으로 프로젝트를 생성했으니 </p>
<h2 id="😎해결">😎해결</h2>
<blockquote>
<p>아래와 같이 터미널에 입력하면 해결 완료!</p>
</blockquote>
<pre><code> npm add -D web-vitals </code></pre><p><img src="https://velog.velcdn.com/images/d-x-eg/post/e961300b-ba58-4f80-b3ca-cda0b1a1106b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[react 배열값을 하나씩 불러오는법🧩]]></title>
            <link>https://velog.io/@d-x-eg/0-v5f651h1</link>
            <guid>https://velog.io/@d-x-eg/0-v5f651h1</guid>
            <pubDate>Mon, 20 Jan 2025 01:12:00 GMT</pubDate>
            <description><![CDATA[<h2 id="배열을-하나씩-불러오는-법">배열을 하나씩 불러오는 법</h2>
<p><strong><code>arr</code></strong>라는 배열에 각 아이디 타이틀 설명이 있다.</p>
<pre><code>const arr = [
    {id: 1, title: &#39;홍길동&#39;,body:&quot;1번임&quot;},
    {id: 2, title: &#39;홍길순&#39;,body:&quot;1번임&quot;},
    {id: 3, title: &#39;홍길장&#39;,body:&quot;1번임&quot;},
];
</code></pre><p><img src="https://velog.velcdn.com/images/d-x-eg/post/07576d29-c285-48fa-817b-83883f21444d/image.png" alt=""></p>
<blockquote>
<p>위와 같이  하나씩 순서대로 불러와 보여주고싶다.</p>
</blockquote>
<p>라고 할때 하는 <strong>방법</strong></p>
<pre><code>import User from &#39;./User&#39;; // 1)배열이 들어있는 페이지 불러오기 먼저해주고 

function App() {

  return (
        &lt;div&gt;
            &lt;User&gt;&lt;/User&gt; &lt;- 불러올 태크를 넣어준다.
        &lt;/div&gt;
    );
}

export default App;</code></pre><p><img src="https://velog.velcdn.com/images/d-x-eg/post/714df8af-e435-4180-a9da-7d33a2f5097d/image.png" alt=""></p>
<p>여기서 불러올 User.js 페이지를 생성한 후</p>
<pre><code>function User(){
    const arr = [
        {id: 1, name: &#39;홍길동&#39;,num:&quot;1번임&quot;},
        {id: 2, name: &#39;홍길순&#39;,num:&quot;2번임&quot;},
        {id: 3, name: &#39;홍길장&#39;,num:&quot;3번임&quot;},
    ];
}</code></pre><p>여기서 arr에 담긴 각 배열을 하나씩 담아 다시 뽑아보자!</p>
<h3 id="1-const-userlist--">1. <strong>const UserList = []</strong></h3>
<p>배열을 뽑아 새로 담을 변수를 선언해주고</p>
<h3 id="2-forlet-i0i-arrlengthi">2. for(let i=0;i&lt; arr.length;i++){}</h3>
<p>for문으로 각 하나의 배열안의 순서대로 불러오고</p>
<h3 id="3-let-t--arri">3. let t = arr[i];</h3>
<p>순서에 맞게 i에 담아주고</p>
<h3 id="4userlistpush">4.UserList.push()</h3>
<p>UserList에 넣아주는데 이때 중요한 포인트가 나온다!</p>
<h3 id="5-li안에-하나씩-넣어주기">5. li안에 하나씩 넣어주기</h3>
<pre><code>   UserList.push(
            &lt;li key={t.id}&gt;  //id값은 key에 넣고 안넣으면 에러생김..
                안녕하세요{t.name} //보여지는 화면에 타이틀인 이름을 넣고
                &lt;span&gt;저의 순서는 {t.num}입니다.&lt;/span&gt; 그아래 순서를 맞게 넣어준다.
            &lt;/li&gt;
        )</code></pre><h3 id="6순서대로-담은-arrlist를-넣어주기">6.순서대로 담은 {ArrList}를 넣어주기</h3>
<pre><code>return( //마지막으로 리턴
        &lt;nav&gt;
            &lt;ol&gt;
                {ArrList} //최종 완료된 li를 넣어주면!
            &lt;/ol&gt;
        &lt;/nav&gt;
    )</code></pre><p>완성!!! </p>
<p>최종 코트는</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/c4c51e1f-145a-49f2-b8b4-8965dcd0bee2/image.png" alt=""></p>
<p>보여지는 화면은 
<img src="https://velog.velcdn.com/images/d-x-eg/post/3aef2544-9443-4bbb-b30c-e415aabea545/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>무수히 많은 배열이라 하더라도 순서가 있으면 
맞게 뽑아 올 수 있다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[gitignore 이해 및 구성]]></title>
            <link>https://velog.io/@d-x-eg/gitignore-%EC%9D%B4%ED%95%B4-%EB%B0%8F-%EA%B5%AC%EC%84%B1</link>
            <guid>https://velog.io/@d-x-eg/gitignore-%EC%9D%B4%ED%95%B4-%EB%B0%8F-%EA%B5%AC%EC%84%B1</guid>
            <pubDate>Wed, 17 Apr 2024 08:43:19 GMT</pubDate>
            <description><![CDATA[<p>사이트 프로젝트를 진행하다 아무것도 만지지않았는데
대기파일에 뜨는 아래 파일들..
<img src="https://velog.velcdn.com/images/d-x-eg/post/ffa3db6f-9627-407a-b5b7-6c73e37632ea/image.jpeg" alt="">
이게 뭐람.. 허허.. 검색을 하다 알게 되었다.</p>
<h1 id="🔒-gitignore">🔒 .gitignore?</h1>
<p>프로젝트 내에서 <strong>불 필요하다고 느끼는</strong> 특정 파일 및 폴더에 대해서** 올리지 않기 위함**
Git이 무시해야 하는 <strong>의도적으로 추적되지 않은 파일</strong>을 지정한다.</p>
<p>한마디로</p>
<blockquote>
<p>용량이크거나, 보안문제, 불필요한 파일 및 경로를 올리지 않도록 설정</p>
</blockquote>
<h2 id="사용법">사용법</h2>
<ul>
<li>/pattern/은 디렉토리 이름과 일치</li>
<li>*, ?, [] 특수 문자 허용</li>
<li>#으로 시작하는 줄은 주석이므로 무시</li>
<li>/로 끝나는 패턴은 디렉터리를 지정</li>
<li>! 뒤에 오는 패턴은 일치 규칙을 무효화</li>
</ul>
<h3 id="예시">예시)</h3>
<p><strong>모든 .log 파일을 무시</strong></p>
<pre><code>*.log</code></pre><p><strong>temp 디렉터리의 모든 파일 무시</strong></p>
<pre><code>temp/</code></pre><p><strong>node_modules 디렉터리의 파일 무시</strong></p>
<pre><code>node_modules/</code></pre><p><strong>특정 파일을 무시합니다.</strong></p>
<pre><code>config.ini</code></pre><p><strong>특정 파일이나 디렉터리가 무시되지 않도록 제외.</strong></p>
<pre><code>!important.txt</code></pre><p>하지만 어느 파일이 불필요한지 모르겠으면 아래 사이트에서
간단하게 쓰는 언어를 검색하면 자동으로 만들어준다.</p>
<p><a href="https://www.toptal.com/developers/gitignore">gitignore</a></p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/15512122-3453-4ba1-b470-90d539c51805/image.png" alt=""></p>
<p>현재 사이트 프로젝트에 사용하는 언어를 넣고 생성하면
<img src="https://velog.velcdn.com/images/d-x-eg/post/9a708712-a845-4ce6-83fa-f109fcda6b57/image.png" alt="">
이런식으로 추천해준다.
세상 이런 편한 사이트가 있다니🎉
하지만 모두 다 필요한게 아니니 검색을 하여 추려준다.</p>
<hr>
<p>여기서 다시한번 파일은 확인해보면
<img src="https://velog.velcdn.com/images/d-x-eg/post/ffa3db6f-9627-407a-b5b7-6c73e37632ea/image.jpeg" alt=""></p>
<p>idea/ 라고 앞에 붙는다</p>
<p>그럼 <strong>.idea</strong>가 뭘까?</p>
<h2 id="🔒-idea">🔒 .idea&#39;</h2>
<p><strong>IntelliJ IDEA, PyCharm, PhpStorm, WebStorm</strong> 등과 같은 <strong>JetBrains IDE</strong>를 사용하여 개발된 프로젝트와 일반적으로 연결된 디렉터리이며, <strong>JetBrains IDE</strong> 환경에 맞게 조정된 프로젝트별 구성 파일과 설정이 포함하고 있다.</p>
<blockquote>
<p> &#39;.idea&#39; 디렉터리에는 JetBrains IDE에 대한 프로젝트별 설정 및 구성이 포함되어 있으며, 프로젝트의 개발 환경과 워크플로를 정의하는 데 중요한 역할</p>
</blockquote>
<h3 id="구성파일">구성파일</h3>
<ul>
<li>workspace.xml: 작업공간 전체 설정을 저장(창, 탭, 도구 창 및 기타 UI 관련 구성의 배열)</li>
<li>misc.xml: 기타 프로젝트 설정이 포함</li>
<li>modules.xml: 모듈 종속성과 같은 모듈별 설정을 저장</li>
<li>vcs.xml: 버전 관리 통합과 관련된 구성</li>
<li>*.iml(모듈 파일): 모듈의 구조, 콘텐츠 루트 및 종속성을 설명</li>
</ul>
<p><strong>.idea</strong> 디렉토리는 <strong>JetBrains IDE</strong>가 프로젝트별 설정 및 구성을 유지하는 데 필수적이며, 일반적으로 팀 구성원 간의 일관된 개발 환경을 보장하기 위해 버전 제어 시스템에 포함되어야 한다. 단, 사용자별 설정이나 작업공간 구성 등 <strong>&#39;.idea&#39;</strong> 디렉터리 내의 일부 파일은 버전 관리에 적합하지 않을 수 있으므로 <strong>&#39;.gitignore&#39;</strong>에 추가할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/09c7d0b9-88ac-4bac-ad85-b3a8e7ef7834/image.png" alt=""></p>
<p>검색하여 이렇게 추가하고 올려주면 
<img src="https://velog.velcdn.com/images/d-x-eg/post/30920b74-d9d8-44ff-9705-0469febb2f1f/image.png" alt=""></p>
<p>끝~! 🎈</p>
<blockquote>
<p>딱히 신경써본적 없지만, 간단하면서도 꽤 중요한 gitignore
추후 다른 프로젝트에서도 유용하게 사용 될 것 같다~!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git 관련 코드]]></title>
            <link>https://velog.io/@d-x-eg/Git-%EA%B4%80%EB%A0%A8-%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@d-x-eg/Git-%EA%B4%80%EB%A0%A8-%EC%BD%94%EB%93%9C</guid>
            <pubDate>Tue, 16 Apr 2024 07:56:22 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/d-x-eg/post/782b021a-d2c9-4927-819e-72be498ba7fe/image.png" alt=""></p>
<h2 id="터미널-ctrl--alt--t-">*<em>터미널 (ctrl + Alt + T) *</em></h2>
<p><strong>- git 저장소 생성</strong></p>
<pre><code>git init</code></pre><p><strong>- 저장소 상태 확인</strong></p>
<pre><code>git init</code></pre><p><strong>- 현재 상태 확인</strong></p>
<pre><code>git status</code></pre><p>*<em>- 전체 로그 확인 *</em></p>
<pre><code>git log</code></pre><p><strong>- 디렉토리 생성</strong></p>
<pre><code>mkdir 디렉토리명</code></pre><p><strong>파일, 디렉토리 삭제</strong>
(디렉토리의 경우 -r을 붙여서 삭제)</p>
<pre><code>rm 삭제 명</code></pre><p><strong>변경 내용을 현재 디렉토리로 가져오기 (pull)</strong></p>
<pre><code>git pull</code></pre><p><strong>- Stage에 파일 추가</strong></p>
<pre><code>git add 파일명
git add *

- 변경사항 한번에 모두 포함
git add -A</code></pre><p><strong>- 커밋 생성</strong></p>
<pre><code>git commit -m 커밋 내용</code></pre><p><strong>- 버전 이력 확인</strong></p>
<pre><code>git log</code></pre><p><strong>- stage에 추가된 파일 삭제</strong></p>
<pre><code>git reset 파일명</code></pre><p><strong>- 변경했던 파일을 최신 버전으로 되돌림</strong></p>
<pre><code>git checkout -- 파일명</code></pre><p><strong>- 커밋 취소 되돌림</strong></p>
<pre><code>1) 최신
git reset HEAD^
2) 특정
git reset --hard 원하는 버전 commit hash</code></pre><h2 id="git-branch-관련">Git Branch 관련</h2>
<p>(생성, 확인, 푸쉬)</p>
<h3 id="브랜치란">브랜치란?</h3>
<p>독립적으로 관리되고 있는 분리된 버전</p>
<p>→ 이를 통해 병렬적인 작업이 가능하다.</p>
<p>*<em>- github 주소와 연결 *</em></p>
<pre><code>git remote add origin github 주소</code></pre><p><strong>- 브랜치 생성</strong></p>
<pre><code>git branch 브랜치명</code></pre><p><strong>- 브랜치 리스트 출력</strong></p>
<pre><code>git branch</code></pre><p><strong>- 브랜치 이동</strong></p>
<pre><code>git checkout 브랜치명</code></pre><p><strong>- 원하는 브랜치로 이동했는지 확인</strong></p>
<pre><code>git branch</code></pre><p><strong>- 브랜치 병합</strong></p>
<pre><code>git merge 브랜치명</code></pre><p>→ 현재 있는 브랜치에 브랜치명의 브랜치를 병합함.</p>
<p><strong>- 브랜치 삭제</strong></p>
<pre><code>git branch -d 브랜치명</code></pre><p><strong>- 파일 및 폴더 add</strong></p>
<pre><code>git add.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Git 이란?]]></title>
            <link>https://velog.io/@d-x-eg/Git-%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@d-x-eg/Git-%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Tue, 16 Apr 2024 07:31:29 GMT</pubDate>
            <description><![CDATA[<h1 id="🧶git">🧶Git?</h1>
<p><img src="https://velog.velcdn.com/images/d-x-eg/post/b24613eb-6954-431f-aab1-7fd3adf190b3/image.png" alt=""></p>
<p>소스 코드를 관리하는 데 주로 사용되는 분산 버전 제어 시스템
Linus Torvalds가 Linux 커널 개발을 관리하기 위해 만들었으며, 유연성, 속도, 강력한 분기 및 병합 기능으로 인해 세계에서 가장 인기 있는 버전 제어 시스템이다.</p>
<p><strong>한마디로</strong></p>
<blockquote>
<p>오픈소스 분산 버전 관리 시스템의 일종</p>
</blockquote>
<h2 id="git-주요-기능">Git 주요 기능</h2>
<h3 id="1-버전-제어">1) 버전 제어</h3>
<p>Git은 시간 경과에 따른 파일 변경 사항을 추적
이를 통해 개발자는 이전 버전으로 되돌리고, 시간 경과에 따른 변경 사항을 비교하고, 누가 어떤 변경을 했는지 확인할 수 있다.</p>
<h3 id="2-분산형">2) 분산형</h3>
<p>Subversion(SVN)과 같은 중앙 집중식 버전 관리 시스템과 달리 Git은 분산형
즉, 모든 개발자는 전체 기록을 포함하여 저장소의 전체 복사본을 갖게 된다.
이를 통해 오프라인 작업이 가능해지고 보다 유연한 협업 워크플로가 가능하다</p>
<h3 id="3-리포지토리">3) 리포지토리</h3>
<p>리포지토리 또는 repo는 Git에서 관리하는 파일 및 폴더 모음
여기에는 누가, 언제 변경했는지 등의 메타데이터와 함께 해당 파일에 대한 전체 변경 내역이 포함</p>
<h3 id="4-커밋">4) 커밋</h3>
<p>커밋은 특정 시점의 저장소 변경 사항에 대한 스냅샷
각 커밋에는 고유 식별자(해시)가 있으며 변경 사항을 설명하는 커밋 메시지가 포함되어 있다.</p>
<h3 id="5-브랜치">5) 브랜치</h3>
<p>Git은 브랜치를 사용하여 개발자가 별도의 개발 스트림에서 동시에 작업 가능
각 브랜치는 독립적인 개발 라인을 나타내며 한 브랜치의 변경 사항은 병합될 때까지 다른 브랜치에 영향을 주지 않는다.</p>
<h3 id="6-병합">6) 병합</h3>
<p>한 분기의 변경 사항을 다른 분기로 결합하는 프로세스
Git은 변경 사항이 충돌하지 않으면 자동으로 병합할 수 있지만 충돌이 발생하는 경우(즉, 한 브랜치의 변경 사항이 다른 브랜치의 변경 사항과 충돌하는 경우) 충돌을 해결하려면 수동 개입이 필요하다.</p>
<h3 id="7-원격-저장소">7) 원격 저장소</h3>
<p>GitHub, GitLab 또는 Bitbucket과 같은 서버에서 호스팅되는 원격 저장소 작업을 지원
개발자는 이러한 원격 저장소에 변경 사항을 푸시하여 자신의 작업을 다른 사람과 공유하고 변경 사항을 가져와서 다른 사람이 만든 업데이트를 통합할 수 있다.</p>
<h3 id="8-포크-및-풀-요청">8) 포크 및 풀 요청</h3>
<p>오픈 소스 프로젝트에 기여하기 위한 일반적인 작업 흐름
GitHub와 같은 플랫폼에서 개발자는 저장소를 포크하여 자신만의 복사본을 만들고 독립적으로 변경한 다음 풀 요청을 제출하여 변경 사항을 원래 저장소에 다시 병합하도록 제안할 수 있다.</p>
<h3 id="결론">결론</h3>
<blockquote>
<p> 프로젝트 관리 및 헙업을 효율적이고 체계적인 개발을 가능하게 한다.</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>