<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yeezinu_98.log</title>
        <link>https://velog.io/</link>
        <description>츄라이츄라이</description>
        <lastBuildDate>Thu, 14 Aug 2025 08:47:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. yeezinu_98.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/yeezinu_98" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[백준 18770 JS]]></title>
            <link>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-18770-JS</link>
            <guid>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-18770-JS</guid>
            <pubDate>Thu, 14 Aug 2025 08:47:59 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-링크">문제 링크</h2>
<blockquote>
<p><a href="https://www.acmicpc.net/problem/18870">좌표 압축</a></p>
</blockquote>
<h2 id="해결과정">해결과정</h2>
<pre><code class="language-js">const fs = require(&quot;fs&quot;);
let [num, ...input] = fs.readFileSync(&quot;/dev/stdin&quot;).toString().trim().split(&quot;\n&quot;);
// 배열로 추출
let arr = input[0].split(&quot; &quot;);
// 정답 배열
let ans = [];
// 배열 내 문자열 -&gt; 넘버
arr = arr.map(Number);
// 중복 제거
let arr2 = new Set(arr);
// 중복 제거 후 정렬
let sortedArr = [...arr2];
sortedArr = sortedArr.sort();
// 정렬된 배열의 인덱스를 찾아 정답 배열에 push
for (let i of arr) {
  ans.push(sortedArr.indexOf(i))
}
// 정답 요구사항대로 출력
console.log(ans.join(&quot; &quot;));
</code></pre>
<p>처음 생각했던 것은 제일 작은 순으로 정렬해서 인덱스를 찾아 답을 제출하면 되겠다는 생각을 했다.</p>
<p>아쉽게도 시간초과가 나왔음.</p>
<p>배열에서의 탐색은 O(N)이라 매번 답을 찾는 과정이 오래걸린듯 하다.</p>
<p>객체에서는 탐색이 O(1)의 복잡도를 갖기 때문에 객체로 교체하였다.</p>
<h2 id="최종">최종</h2>
<pre><code class="language-js">const fs = require(&quot;fs&quot;);
let [num, ...input] = fs.readFileSync(&quot;/dev/stdin&quot;).toString().trim().split(&quot;\n&quot;);

// 입력 값 number로 바꾸기
let arr = input[0].split(&quot; &quot;).map(Number);
// 중복 제거
let uniqueArr = [...new Set(arr)];

// 중복 제거한 배열 정렬
let sortArr = uniqueArr.sort((a, b) =&gt; a - b);

// 정렬된 배열 map으로 만들기.
let sortMap = new Map();

// map에 값 입력 -&gt; [가장 작은 값, 인덱스]
for (let i = 0; i &lt; sortArr.length; i++) {
  sortMap.set(sortArr[i], i);
}

// map에서 해당 값 가져오기.
let ans = &quot;&quot;;
for (let i of arr) {
  ans += sortMap.get(i) + &quot; &quot;;
}

// 결과 출력
console.log(ans);
</code></pre>
<p>성공~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 1181 JS]]></title>
            <link>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-1181-JS</link>
            <guid>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-1181-JS</guid>
            <pubDate>Tue, 29 Jul 2025 10:43:16 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-링크">문제 링크</h2>
<blockquote>
<p><a href="https://www.acmicpc.net/problem/1181">1181 단어정렬</a></p>
</blockquote>
<h2 id="해결-과정">해결 과정</h2>
<p><strong>배열에 중복된 단어를 먼저 제거하기</strong>(방법 2개)
set 사용</p>
<pre><code class="language-js">let arr = [...new Set(input)];</code></pre>
<hr>
<p>includes 메서드로 입력받은 배열 검증</p>
<pre><code class="language-js">let noDuplication = [];
for (let i of input) {
  if (
    !noDuplication.includes(i)) {
    noDuplication.push(i);
  }
}</code></pre>
<hr>
<p><strong>저장된 단어 정렬하기</strong>
-&gt; sort() 사용하기</p>
<pre><code class="language-js">noDuplication.sort((a, b) =&gt; {
  return a.length === b.length
    ? a.charCodeAt(0) - b.charCodeAt(0)
    : a.length - b.length;
});</code></pre>
<p><img src="https://velog.velcdn.com/images/yeezinu_98/post/451e1e30-25bc-4794-a723-7ab44e53388e/image.png" alt="">
it와 im의 순서가 안맞음;;</p>
<hr>
<p><strong>localeCompare() 메서드 사용</strong></p>
<pre><code class="language-js">arr.sort((a, b) =&gt; a.length - b.length || a.localeCompare(b));</code></pre>
<p><img src="https://velog.velcdn.com/images/yeezinu_98/post/f2fb6020-4221-4340-b9b8-ef3b16a558c6/image.png" alt="">
성공~</p>
<h2 id="해결">해결</h2>
<pre><code class="language-js">const fs = require(&quot;fs&quot;);
let [num, ...input] = fs.readFileSync(&quot;ex.txt&quot;).toString().trim().split(&quot;\n&quot;);

let arr = [...new Set(input)];

arr.sort((a, b) =&gt; a.length - b.length || a.localeCompare(b));
console.log(arr.join(&quot;\n&quot;));</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 11650 JS]]></title>
            <link>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-11650-JS</link>
            <guid>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-11650-JS</guid>
            <pubDate>Mon, 28 Jul 2025 10:18:42 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-링크">문제 링크</h2>
<blockquote>
<p><a href="https://www.acmicpc.net/problem/11650">11650 좌표정렬하기</a></p>
</blockquote>
<h2 id="해결과정">해결과정</h2>
<p>기본적으로는 x좌표 기준으로 정렬
x좌표가 같으면 y좌표 기준으로 정렬
-&gt; x배열이랑 y배열 하나씩 만들어서 합칠까?</p>
<p>sort 안에서 정렬이 가능
-&gt; 2차원 배열로 만들어서 sort 안에서 해결하자</p>
<h2 id="해결">해결</h2>
<pre><code class="language-js">const fs = require(&quot;fs&quot;);
let [num, ...input] = fs.readFileSync(&quot;ex.txt&quot;).toString().trim().split(&quot;\n&quot;);
let arr = input.map((el) =&gt; el.split(&quot; &quot;).map(Number));

arr.sort((a, b) =&gt; {
  return a[0] === b[0] ? a[1] - b[1] : a[0] - b[0];
});

let point = [];
for (let i = 0; i &lt; Number(num); i++) {
  let ans = arr[i].join(&quot; &quot;);
  point.push(ans);
}

console.log(point.join(&quot;\n&quot;));
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 2751 js]]></title>
            <link>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-2751-js</link>
            <guid>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-2751-js</guid>
            <pubDate>Fri, 25 Jul 2025 08:06:56 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-번호">문제 번호</h2>
<blockquote>
<p><a href="https://www.acmicpc.net/problem/2751">2751 수 정렬하기</a></p>
</blockquote>
<h2 id="해결-과정">해결 과정</h2>
<ul>
<li>1번줄 = 출력할 갯수</li>
<li>2~ = 출력해야할 숫자 N</li>
<li>1 ≤ N ≤ 1,000,000</li>
<li>숫자 N은 중복없음!
  -&gt; 이게 진짜 큰 힌트였음</li>
</ul>
<p>-&gt; js 내장함수인 sort를 사용하면되겠다!</p>
<h3 id="시간-초과">시간 초과</h3>
<pre><code class="language-js">for (let i of arr) {
  console.log(i);
}</code></pre>
<p>console.log()를 반복해서 사용하면 시간초과 뜸!</p>
<p>-&gt; join(&quot;\n&quot;)  사용했음 ㅇㅅㅇ</p>
<h2 id="문제-해결">문제 해결</h2>
<pre><code class="language-js">const fs = require(&quot;fs&quot;);

let [num, ...arr] = fs.readFileSync(&quot;ex.txt&quot;).toString().trim().split(&quot;\n&quot;).map(Number);

arr.sort((a, b) =&gt; a - b);

console.log(arr.join(&quot;\n&quot;));
</code></pre>
<h3 id="참고-문서">참고 문서</h3>
<blockquote>
<p><a href="https://jeong-park.tistory.com/entry/JavaScript-%EC%B6%9C%EB%A0%A5-%EC%B5%9C%EC%A0%81%ED%99%94-%EB%B0%B1%EC%A4%80%EC%97%90%EC%84%9C-consolelog-%EC%93%B0%EB%A9%B4-%EC%95%88-%EB%90%98%EB%8A%94-%EC%9D%B4%EC%9C%A0">콘솔로그 많이 쓰면 안좋은이유</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 2839 js]]></title>
            <link>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-2839-js</link>
            <guid>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-2839-js</guid>
            <pubDate>Fri, 25 Jul 2025 07:18:30 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-링크">문제 링크</h2>
<blockquote>
<p><a href="https://www.acmicpc.net/problem/2839">2839 설탕 배달</a></p>
</blockquote>
<h2 id="해결-과정">해결 과정</h2>
<p>최소자루를 구하는 문제다 보니 5, 3 두 자루중 5개로 먼저 빼면 될 것이라 생각.
아쉽게도 5로 먼저 나누면 6이들어오면 에러가 발생해서 실패</p>
<p>5로 나눈 값이 0이 되어야하고 3으로 나눈 값도 0이 되어야 조건 만족을 함.
-&gt; 5로나눈 나머지가 0이 될때 까지 3을 빼주면서 반복했음.</p>
<h2 id="해결">해결</h2>
<pre><code class="language-js">const fs = require(&quot;fs&quot;);

let N = +fs.readFileSync(&quot;ex.txt&quot;).toString().split(&quot; &quot;);

let cnt = 0; // 3 자루 갯수

while (true) {
  if (N % 5 === 0) {
    console.log(N / 5 + cnt);
    break;
  }

  if (N &lt; 0) {
    console.log(-1);
    break;
  }
  cnt++;
  N -= 3;
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 1018 js]]></title>
            <link>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-1018-js</link>
            <guid>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-1018-js</guid>
            <pubDate>Thu, 24 Jul 2025 09:50:52 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-링크">문제 링크</h2>
<blockquote>
<p><a href="https://www.acmicpc.net/problem/1018">백준 1018</a></p>
</blockquote>
<h2 id="문제-해결">문제 해결</h2>
<p>체스판에 색을 다시칠해야 한다는것을 보자마자 일단 2차원배열이겠거니 생각했다.
그런데 변경을 최소한으로 하려면 어떻게해야할지 잠깐 고민을 했다.
설마 일일히 다 비교해야하나? 라는 생각을 했는데 문제 유형이 브루트포스였고 그게맞았다.</p>
<h2 id="해결">해결</h2>
<pre><code class="language-js">const fs = require(&quot;fs&quot;);

let [size, ...arr] = fs.readFileSync(&quot;ex.txt&quot;).toString().split(&quot;\n&quot;);

let [row, col] = size.split(&quot; &quot;);
arr = arr.map((i) =&gt; i.split(&quot;&quot;));

const answer = [];

const WHITE = [
  &quot;WBWBWBWB&quot;,
  &quot;BWBWBWBW&quot;,
  &quot;WBWBWBWB&quot;,
  &quot;BWBWBWBW&quot;,
  &quot;WBWBWBWB&quot;,
  &quot;BWBWBWBW&quot;,
  &quot;WBWBWBWB&quot;,
  &quot;BWBWBWBW&quot;,
];

const BLACK = [
  &quot;BWBWBWBW&quot;,
  &quot;WBWBWBWB&quot;,
  &quot;BWBWBWBW&quot;,
  &quot;WBWBWBWB&quot;,
  &quot;BWBWBWBW&quot;,
  &quot;WBWBWBWB&quot;,
  &quot;BWBWBWBW&quot;,
  &quot;WBWBWBWB&quot;,
];

function checkWhite(x, y) {
  let cnt = 0;
  for (let i = 0; i &lt; 8; i++) {
    for (let j = 0; j &lt; 8; j++) {
      if (arr[i + x][j + y] === WHITE[i][j]) cnt++;
    }
  }
  return cnt;
}

function checkBlack(x, y) {
  let cnt = 0;
  for (let i = 0; i &lt; 8; i++) {
    for (let j = 0; j &lt; 8; j++) {
      if (arr[i + x][j + y] === BLACK[i][j]) cnt++;
    }
  }
  return cnt;
}

for (let i = 0; i &lt; row - 7; i++) {
  for (let j = 0; j &lt; col - 7; j++) {
    answer.push(checkWhite(i, j));
    answer.push(checkBlack(i, j));
  }
}
console.log(Math.min(...answer));</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 1436번 js]]></title>
            <link>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-1436%EB%B2%88-js</link>
            <guid>https://velog.io/@yeezinu_98/%EB%B0%B1%EC%A4%80-1436%EB%B2%88-js</guid>
            <pubDate>Thu, 24 Jul 2025 09:06:08 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-링크">문제 링크</h2>
<blockquote>
<p><a href="https://www.acmicpc.net/problem/1436">1436 영화감독 숌</a></p>
</blockquote>
<h2 id="해결-과정">해결 과정</h2>
<p>숌은 666이 제일 작은 종말의 단위라 생각한다.
두번째로 작은 재앙 -&gt; 1666
(n-1)666이라고 생각했는데 예제 4부터 이상해서 그건 아니라고 생각.</p>
<p><img src="https://velog.velcdn.com/images/yeezinu_98/post/b4f60c4b-9951-452d-8e5d-8ca76f60ad51/image.png" alt=""></p>
<blockquote>
<p>종말의 수란 어떤 수에 6이 적어도 3개 이상 연속으로 들어가는 수를 말한다. </p>
</blockquote>
<p>지문을 다시 읽어보던 중 해당 문구를 발견.
아.. 숌은 그냥 666이 좋은거임.
666만 있으면 만사 오케이인 친구였던것임!</p>
<h2 id="해결">해결</h2>
<pre><code class="language-javascript">let input = +fs.readFileSync(&quot;ex.txt&quot;).toString().split(&quot; &quot;);

let cnt = 1;
let num = 666;

while (cnt !== input) {
  num++;

  if (String(num).includes(&quot;666&quot;)) {
    cnt++;
  }
}

console.log(num);
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[리액트 Virtual DOM]]></title>
            <link>https://velog.io/@yeezinu_98/%EB%A6%AC%EC%95%A1%ED%8A%B8-Virtual-DOM</link>
            <guid>https://velog.io/@yeezinu_98/%EB%A6%AC%EC%95%A1%ED%8A%B8-Virtual-DOM</guid>
            <pubDate>Sun, 04 Feb 2024 14:52:04 GMT</pubDate>
            <description><![CDATA[<p>리액트에서 Virtual DOM 사용하는 이유
리액트 이전
기존 웹페이지에서 서버와 통신하며 요청을 주고 받으면, 받은 데이터를 DOM 객체에 속성값들을 변화시키거나 DOM을 추가 또는 제거하도록 만들었습니다. 그리고 이러한 변경이 있을 때마다 DOM 객체의 변경에 대한 코드를 만들어줘야 했습니다. 뿐만 아니라 DOM 객체에 대한 연산이 많아질수록 reflow, repaint 연산이 많아지면서 브라우저가 컴퓨팅 자원을 많이 사용해야 했습니다.</p>
<p>reflow, repaint
reflow란 화면구조가 변경되었을 때 문서의 일부 또는 전체를 다시 렌더링하기 위해 문서에서 요소의 위치와 크기등의 형상을 다시 계산하는 것을 의미합니다. 대표적으로 화면의 크기 변화, 페이지 초기 렌더링, DOM의 동적 변화가 있는 경우 reflow가 발생합니다. 또한 경우에 따라서 문서의 단일 요소를 reflow하려면 상위 요소와 그 뒤에 오는 모든 요소를 reflow해야 할 수 도 있습니다.</p>
<p>repaint란 이름에서 알 수 있듯이 요소의 보이는 것에 영향을 주지만 레이아웃에는 영향을 주지 않는 요소 변경으로 화면에 다시 그려주는 작업입니다. reflow가 발생하면 변경된 렌더 트리를 화면에 다시 그려야해서 repaint가 발생합니다. 또한 레이아웃에 영향을 주지 않지만 color, background-color, visibility 등과 같은 스타일 속성의 변경에는 reflow는 발생하지 않고, repaint만 발생합니다.</p>
<p>살펴본 reflow, repaint는 컴퓨팅 파워를 많이 필요로 하는 비싼 작업입니다. reflow, repaint가 많이 일어날수록 하드웨어에 많은 부담을 주게 되고, 그 결과 사용자 경험이 나빠질 수 있습니다.</p>
<p>리액트의 문제 해결
이를 해결하기 위해 리액트는 Virtual DOM을 활용해 UI의 이상적인 “가상”적인 표현을 메모리에 저장하고 ReactDOM과 같은 라이브러리에 의해 “실제” DOM과 동기화 합니다. 이 과정을 재조정(Reconciliation)이라고 합니다.
이렇게 연산이 끝난 뒤 최종적인 변화를 실제 DOM에 반영해서 여러 번 reflow, repaint가 발생할 수 있는 작업을 한번으로 줄여줍니다. 또한, Virtual DOM은 변화에 대한 관리를 자동화하고 추상화해서 작업의 편의성을 제공합니다.
재조정에 대해 조금 더 알아보면, 기존에 하나의 트리를 가지고 다른 트리로 변환하기 위한 최소한의 연산 수를 구하는 최첨단 알고리즘도 n개의 엘리먼트가 있는 트리에 대해 O(n^3)의 복잡도를 가지고 있는 한계가 있었습니다. 이에 대해 리액트는 1) 서로 다른 두 엘리먼트는 서로 다른 트리를 만들어낸다. 2) 개발자가 key prop을 통해, 여러 렌더링 사이에서 어떤 자식 엘리먼트가 변경되지 않아야 할지 표시해 줄 수 있습니다. 두 가정을 기반하여 O(n) 복잡도의 비교 알고리즘을 구현했습니다.</p>
<p>참고 자료
<a href="https://blog.drakejin.me/React-VirtualDOM-And-Repaint-Reflow/">https://blog.drakejin.me/React-VirtualDOM-And-Repaint-Reflow/</a></p>
<p><a href="https://ko.legacy.reactjs.org/docs/faq-internals.html#gatsby-focus-wrapper">https://ko.legacy.reactjs.org/docs/faq-internals.html#gatsby-focus-wrapper</a></p>
<p><a href="https://www.codeit.kr/learn/3799">https://www.codeit.kr/learn/3799</a></p>
<p><a href="https://medium.com/swlh/what-the-heck-is-repaint-and-reflow-in-the-browser-b2d0fb980c08">https://medium.com/swlh/what-the-heck-is-repaint-and-reflow-in-the-browser-b2d0fb980c08</a></p>
<p><a href="https://velopert.com/3236">https://velopert.com/3236</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[간단한 문제]]></title>
            <link>https://velog.io/@yeezinu_98/%EA%B0%84%EB%8B%A8%ED%95%9C-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@yeezinu_98/%EA%B0%84%EB%8B%A8%ED%95%9C-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sun, 04 Feb 2024 12:53:35 GMT</pubDate>
            <description><![CDATA[<pre><code>
// 1번
let num = 1;

// 2번
setTimeout(() =&gt; {
  num = 2;
}, 0);

// 3번
num = 3;

// 4번
console.log(num);
</code></pre><p>부트캠프 과정 중 위 코드의 출력 값을 맞춰보라는 문제가 있었다.</p>
<blockquote>
<p>결과는 3이다.</p>
</blockquote>
<p>왜 와이?</p>
<ul>
<li>1번에서 let으로 num에 1을 할당했고 let은 재할당이 가능함</li>
<li>2번에서 setTimeout함수를 사용했으나 0초뒤에 시작하니 바로 실행됨</li>
<li>3번에서 num은 3이라고 재 할당 해줬음</li>
<li>그래서 답은 3임</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP 메소드]]></title>
            <link>https://velog.io/@yeezinu_98/HTTP-%EB%A9%94%EC%86%8C%EB%93%9C</link>
            <guid>https://velog.io/@yeezinu_98/HTTP-%EB%A9%94%EC%86%8C%EB%93%9C</guid>
            <pubDate>Sun, 28 Jan 2024 13:02:28 GMT</pubDate>
            <description><![CDATA[<p>HTTP 메소드는 클라이언트와 서버가 <strong>통신</strong>할 때 <strong>서버가 주어진 리소스에 수행하길 원하는 행동</strong>을 나타낸다.
즉, <strong>서버가 수행해야할 동작을 나타내는 메서드</strong>이다.</p>
<p>HTTP메서드에는 총 9개의 종류가 있으나 주로 쓰이는 메서드는 5개이다.
<strong>주요 메소드</strong></p>
<ul>
<li>GET : 리소스 조회 , 값을 가져오기만 함</li>
<li>POST : 데이터 추가, 등록 </li>
<li>PUT : 리소스 대체, 수정 / 해당 리소스가 없으면 생성</li>
<li>PATCH : 리소스 부분 수정 / 수정만 됨</li>
<li>DELETE : 리소스 삭제</li>
</ul>
<p><strong>기타 메소드</strong></p>
<ul>
<li>HEAD : GET과 동일한 방식으로 작동하나 헤더 값만 요청</li>
<li>OPTIONS : 해당 리소스에서 사용 가능한 옵션을 요청, CORS에서 사용 됨</li>
<li>CONNECT : 요청한 리소스에 대한 터널 설정</li>
<li>TRACE : 대상 리소스에 대한 경로를 따라 메세지 루프백 테스트를 진행</li>
</ul>
<h2 id="get">GET</h2>
<ul>
<li>리소스 조회 메서드</li>
<li>사용 방식 : GET /members/100</li>
<li>원하는 데이터가 있다면? 쿼리스트링을 통해서 전달하면됨 
: GET /members/100?username=inpa&amp;height=200</li>
</ul>
<h2 id="post">POST</h2>
<ul>
<li>데이터 추가, 등록 메서드</li>
<li>보통 요청할 때 form이벤트를 많이 사용함.<pre><code>HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 34
Location: /members/100
</code></pre></li>
</ul>
<p>{
    &quot;username&quot;: &quot;big5&quot;,
    &quot;age&quot;: 20
}</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[이벤트 버블링, 캡쳐링, 위임]]></title>
            <link>https://velog.io/@yeezinu_98/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81-%EC%BA%A1%EC%B3%90%EB%A7%81-%EC%9C%84%EC%9E%84</link>
            <guid>https://velog.io/@yeezinu_98/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81-%EC%BA%A1%EC%B3%90%EB%A7%81-%EC%9C%84%EC%9E%84</guid>
            <pubDate>Sun, 28 Jan 2024 11:52:02 GMT</pubDate>
            <description><![CDATA[<p>오늘은 이벤트의 버블링, 캡쳐링, 위임에 대해서 알아보는 시간을 갖겠어용~!</p>
<p><img src="https://velog.velcdn.com/images/yeezinu_98/post/439205aa-6bf4-4253-9bbc-373dc9322a83/image.png" alt="">
위 이미지는 이벤트가 일어나는 과정을 간략하게 그려놓은 흐름도 입니다.</p>
<h2 id="이벤트의-흐름">이벤트의 흐름</h2>
<p>표준 DOM이벤트에서 정의한 이벤트 흐름에는 총 3가지 단계가 있어요.</p>
<ol>
<li><strong>캡쳐링 단계</strong> : 이벤트가 하위 요소로 전파되는 단계</li>
<li><strong>타깃 단계</strong> : 이벤트가 실제 타깃요소에 전달되는 단계</li>
<li><strong>버블링 단계</strong> : 이벤트가 상위 요소로 전파되는 단계</li>
</ol>
<h2 id="캡처링">캡처링</h2>
<p><strong>캡처링은 최상위 요소에서 이벤트가 발생한 요소를 찾아가는 것을 말한다.</strong></p>
<blockquote>
<p>잘 사용되지 않는다고 한다.</p>
</blockquote>
<pre><code class="language-js">// 사용예제
// div 까지의 캡쳐링

const input = document.querySelector(&quot;div&quot;);

const clickEvent = (e) =&gt; {
    cosole.log(e.currentTarget.tagname);
};

input.addEventListener(&quot;click&quot;, clickEvent, {capture: true});
</code></pre>
<p><code>on&lt;event&gt;</code>프로퍼티나 HTML 속성, <code>addEventListener</code>의 <code>capture</code>옵션의  값이 true면 캡쳐링일 때 동작하게 할 수 있다.
반대로 옵션의 값이 false면 버블링 일 때 동작.</p>
<h2 id="버블링">버블링</h2>
<p>한 요소에서 이벤트가 발생하면 이 요소에 할당된 이벤트 핸들러가 동작하고 이후 부모요소의 핸들러가 동작한다, 그렇게 최상단 요소까지 타고 올라가면서 이벤트 핸들러가 동작한다.</p>
<blockquote>
<p>버블 버블 버블 팝 버블 버블 팝 팝</p>
</blockquote>
<pre><code>// 사용 예제
// 누른 요소에 대한 alert
&lt;form onclick=&quot;alert(&#39;form&#39;)&quot;&gt;FORM
  &lt;div onclick=&quot;alert(&#39;div&#39;)&quot;&gt;DIV
    &lt;p onclick=&quot;alert(&#39;p&#39;)&quot;&gt;P&lt;/p&gt;
  &lt;/div&gt;
&lt;/form&gt;</code></pre><p>p태그를 클릭하면 p -&gt; div -&gt; form 순으로 alert가 출력된다.</p>
<h2 id="버블링-막기">버블링 막기</h2>
<p>버블링은 <code>거의</code> 모든 동작에서 일어나는데 어떻게 막나요?</p>
<pre><code>&lt;body onclick=&quot;alert(`버블링은 여기까지 도달하지 못합니다.`)&quot;&gt;
  &lt;button onclick=&quot;event.stopPropagation()&quot;&gt;클릭해 주세요.&lt;/button&gt;
&lt;/body&gt;</code></pre><blockquote>
<p>.stopPropagation();</p>
</blockquote>
<p>이거쓰면 위로 버블링 되는건 막아주는데 같은 레벨에서 동작하는 이벤트들은 못 막음</p>
<blockquote>
<p>event.stopImmediatePropagation()</p>
</blockquote>
<p>이렇게 하면 같은 레벨에서 동작하는 이벤트도 막아줌</p>
<h3 id="버블링-안되는-이벤트">버블링 안되는 이벤트</h3>
<p>이벤트 중에서는 버블링이 안되는 이벤트들이 있다.
<strong>마우스이벤트</strong></p>
<ul>
<li>mouseenter : 마우스 포인터가 요소 위로 올라온 순간</li>
<li>mouseleave : 마우스 포인터가 요소에서 벗어나는 순간</li>
</ul>
<p><strong>포커스 이벤트</strong></p>
<ul>
<li>focus : 요소에 포커스가 되는 순간</li>
<li>blur : 요소로부터 포커스가 빠져나가는 순간</li>
</ul>
<h2 id="eventtarget">event.target</h2>
<p>event.target과 event.currentTarget의 차이를 아는 것도 중요하다.</p>
<blockquote>
<p><strong>event.target</strong> : 이벤트가 발생한 요소 (고정)
<strong>event.currentTarget</strong> : 현재 실행중인 이벤트가 할당된 요소 (변경됨, this)</p>
</blockquote>
<p>예를 들어 위에 이미지의 input에서 동작이 일어났으면 target은 input이 되고  currentTarget은 이벤트 리스너가 달린 다른 태그가 될 수 있다.</p>
<h2 id="이벤트-위임">이벤트 위임</h2>
<p>버블링의 속성을 이용하여 이벤트 위임이라는 것을 할 수 있다.
<strong>이벤트 위임이란?</strong>
원하는 요소 그룹의 부모에 이벤트를 할당하여 자식그룹에 동일한 이벤트를 사용하게 하는 것이다.</p>
<p>표나 같은 형식의 인풋이나 요소를 클릭하는곳에 사용할 수 있다.</p>
<pre><code>&lt;button data-toggle-id=&quot;subscribe-mail&quot;&gt;
  구독 폼 보여주기
&lt;/button&gt;

&lt;form id=&quot;subscribe-mail&quot; hidden&gt;
  메일 주소: &lt;input type=&quot;email&quot;&gt;
&lt;/form&gt;

&lt;script&gt;
  document.addEventListener(&#39;click&#39;, function(event) {
    let id = event.target.dataset.toggleId;
    if (!id) return;

    let elem = document.getElementById(id);

    elem.hidden = !elem.hidden;
  });
&lt;/script&gt;</code></pre><p>이런 식으로 사용이 된다.</p>
<h3 id="참고링크">참고링크</h3>
<p><a href="https://ko.javascript.info/bubbling-and-capturing">https://ko.javascript.info/bubbling-and-capturing</a>
<a href="https://ko.javascript.info/event-delegation">https://ko.javascript.info/event-delegation</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[var, let, const]]></title>
            <link>https://velog.io/@yeezinu_98/var-let-const</link>
            <guid>https://velog.io/@yeezinu_98/var-let-const</guid>
            <pubDate>Sun, 21 Jan 2024 09:54:21 GMT</pubDate>
            <description><![CDATA[<p>const 호텔에서 var let 파킹을 제공하는군요! 
정말 고마워요!</p>
<hr>
<p>오늘은 var let const를 중복선언, 스코프, 호이스팅의 관점에서 알아보자.</p>
<h2 id="var">var</h2>
<p><strong>중복선언</strong> : 가능!
-&gt; 이게 말이 안되는일임</p>
<pre><code>var imHappy = &#39;yes&#39;;

var imHappy = &#39;no&#39;;

console.log(imHappy) // no</code></pre><p>한번 선언해도 다시 선언이 가능하다. 
마지막에 선언된걸로 출력됨</p>
<p><strong>스코프</strong> 
이 친구는 함수단위(function)의 스코프를 가진다.</p>
<pre><code>var name = &#39;hello&#39;

function hi() {
  var name = &#39;hi&#39;
  console.log(name) // hi
}

hi()
console.log(name) // hello</code></pre><p><strong>호이스팅</strong> : 가능!</p>
<pre><code>console.log(name); // undefined
var name = hi</code></pre><h2 id="let">let</h2>
<p><strong>중복선언</strong> : 안됨!</p>
<p><strong>스코프</strong>
블록단위의 스코프를 가진다.</p>
<pre><code>{
  let a = hi
}
console.log(a);    //ReferenceError: a is not defined
</code></pre><p><strong>호이스팅</strong> : 가능!</p>
<h2 id="const">const</h2>
<p><strong>중복선언</strong> : 안됨!
초기화와 선언을 동시에 해야함!</p>
<p><strong>스코프</strong>
블록단위 스코프를 가짐
{
  const meet = hi
}
console.log(meet);    //ReferenceError: meet is not defined</p>
<p><strong>호이스팅</strong> : 가능!</p>
<h3 id="temporary-dead-zone">Temporary Dead Zone</h3>
<p><code>let</code>과 <code>const</code>둘다 호이스팅이 되는데 안되는것처럼 보이는건 TDZ에 들어가서임</p>
<p>JS에서는 총 3단계에 걸쳐서 변수를 선언함</p>
<ol>
<li><p>선언(Declaration): 스코프와 변수 객체가 생성, 스코프가 변수 객체를 참조.</p>
</li>
<li><p>초기화(Initialization): 변수 객체 값을 위한 공간을 메모리에 할당. 이 때 할당되는 값은 undefined다.</p>
</li>
<li><p>할당(Assignment): 변수 객체에 값을 할당한다.</p>
</li>
</ol>
<p><code>let</code>과 <code>const</code>둘다 선언은 되어 있으나 초기화가 이뤄지지않음.
실제로 값을 할당하는 부분에 가야 초기화와 할당이 일어남</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS의 얕은복사, 깊은 복사]]></title>
            <link>https://velog.io/@yeezinu_98/JS%EC%9D%98-%EC%96%95%EC%9D%80%EB%B3%B5%EC%82%AC-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC</link>
            <guid>https://velog.io/@yeezinu_98/JS%EC%9D%98-%EC%96%95%EC%9D%80%EB%B3%B5%EC%82%AC-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC</guid>
            <pubDate>Sun, 21 Jan 2024 09:02:38 GMT</pubDate>
            <description><![CDATA[<p>JS의 얕은 복사와 깊은 복사에 대해 알아보자!</p>
<h2 id="js의-데이터-타입">JS의 데이터 타입</h2>
<p>복사를 이해하려면 데이터 타입을 이해해야 한다.</p>
<pre><code>data type --|-- PrimitiveType-|-- Number
               |                  |-- BigInt
            |                  |-- String
            |                 |-- Boolean
            |                 |-- null
            |                 |-- undefined
            |                 |-- Symbol
            |
            |-- Reference Type -- Object - |-- Array
                                              |-- Function
                                           |-- Date
                                           |-- RegExp
                                           |-- Map, WeakMap
                                           |-- Setm WeakSet</code></pre><p>위 내용과 같이 데이터 타입은 크게 2가지로 나뉘게 된다.
기본형과 참조형이다.</p>
<p>모든 <strong>데이터</strong>들은 <strong>비트 단위로 저장</strong>되고 
저장된 데이터들은 <strong>바이트 단위의 식별자</strong>
좀 더 자세하게 <strong>메모리 주솟값</strong>을 통해 서로 구분하고 연결할 수 있다.</p>
<h3 id="기본형-변수-선언과-데이터-할당">기본형 변수 선언과 데이터 할당</h3>
<pre><code class="language-JavaScript">var a;        // 변수 선언

a = 10;        // 데이터 할당

var a = 10;    // 변수 선언과 할당을 동시에!</code></pre>
<table>
<thead>
<tr>
<th align="center">주소(변수 영역)</th>
<th align="center">...</th>
<th align="center">1002</th>
<th align="center">1003</th>
<th align="center">1004</th>
<th align="center">1005</th>
<th align="center">...</th>
</tr>
</thead>
<tbody><tr>
<td align="center">데이터</td>
<td align="center"></td>
<td align="center"></td>
<td align="center">이름: a / 값: @5004</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">주소(데이터 영역)</td>
<td align="center">...</td>
<td align="center">5002</td>
<td align="center">5003</td>
<td align="center">5004</td>
<td align="center">5005</td>
<td align="center">...</td>
</tr>
<tr>
<td align="center">데이터</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center">10</td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">순서</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">1. 변수 영역에서 빈공간(@1003)을 확보한다</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">2. 확보한 공간의 식별자를 a로 지정한다.</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">3. 데이터영역의 빈 공간(@5004)에 문자열 &#39;abc&#39;를 저장한다.</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">4. 변수영역에서 a라는 식별자를 검색한다(@1003).</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">5. 앞서 저장한 문자열의 주소(@5004)를 @1003의 공간에 대입한다.</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
</tbody></table>
<h4 id="값이-변경이-변경-될-때">값이 변경이 변경 될 때</h4>
<table>
<thead>
<tr>
<th align="center">주소(변수 영역)</th>
<th align="center">...</th>
<th align="center">1002</th>
<th align="center">1003</th>
<th align="center">1004</th>
<th align="center">1005</th>
<th align="center">...</th>
</tr>
</thead>
<tbody><tr>
<td align="center">데이터</td>
<td align="center"></td>
<td align="center"></td>
<td align="center">이름: a / 값: @5005</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">주소(데이터 영역)</td>
<td align="center">...</td>
<td align="center">5002</td>
<td align="center">5003</td>
<td align="center">5004</td>
<td align="center">5005</td>
<td align="center">...</td>
</tr>
<tr>
<td align="center">데이터</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center">&#39;abc&#39;</td>
<td align="center">&#39;change&#39;</td>
<td align="center"></td>
</tr>
</tbody></table>
<p>이렇게 기존의 값은 그대로 있고 새로운 공간에 값을 저장해 할당한다.</p>
<p><code>기본형 데이터는 모두 값이 변하지 않고 새로 생성해서 변경하기 때문에 불변 값이다.</code></p>
<h3 id="참조형-변수-선언과-할당">참조형 변수 선언과 할당</h3>
<pre><code>var obj1 = {
    a: 1,
    b: &#39;bbb&#39;
}</code></pre><table>
<thead>
<tr>
<th align="center">주소(변수 영역)</th>
<th align="center">...</th>
<th align="center">1002</th>
<th align="center">1003</th>
<th align="center">1004</th>
<th align="center">1005</th>
<th align="center">...</th>
</tr>
</thead>
<tbody><tr>
<td align="center">데이터</td>
<td align="center"></td>
<td align="center">이름: obj1 / 값: @5002</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">주소(데이터 영역)</td>
<td align="center">...</td>
<td align="center">5002</td>
<td align="center">5003</td>
<td align="center">5004</td>
<td align="center">5005</td>
<td align="center">...</td>
</tr>
<tr>
<td align="center">데이터</td>
<td align="center"></td>
<td align="center">@7103~?</td>
<td align="center"></td>
<td align="center">1</td>
<td align="center">&#39;bbb&#39;</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">주소(객체의 변수 영역)</td>
<td align="center">7103</td>
<td align="center">7104</td>
<td align="center">7105</td>
<td align="center">7106</td>
<td align="center">7107</td>
<td align="center">...</td>
</tr>
<tr>
<td align="center">데이터</td>
<td align="center">이름: a / 값: @5004</td>
<td align="center">이름: b / 값: @5005</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">순서</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">1. 변수영역의 빈공간 확보 후 주소의 이름을 obj1로 지정</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">2. 임의의 데이터 저장공간(@5002)에 데이터를 저장하려고 보니 여러개의 프로퍼티로 이뤄진 데이터그룹임</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">이 그룹의 내부 프로퍼티들을 저장하기 위해 별도의 변수 영역을 마련하고 그 영역의 주소(@7103~?)를 @5002에 저장</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">3. @7103과 @7104에 각각 a와 b라는 프로퍼티 이름 지정</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">4. 데이터 영역에서 숫자 1을 검색, 현재 영역에 값이 없음으로 @5004를 할당, b도 동일한 과정을 거침</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
</tbody></table>
<p><code>객체는 데이터 영역의 값이 바뀌지 않지만 할당된 값이 변경 가능하기 때문에 가변형</code></p>
<p>이러한 데이터의 할당 방식을 가지고 복사를 알아보자.</p>
<h2 id="얕은-복사">얕은 복사</h2>
<p><code>얕은 복사는 객체를 복사할 때 기존값과 복사된 값이 같은 참조를 가리키고 있는 것을 말한다.</code></p>
<h3 id="방식">방식</h3>
<ul>
<li><p>Array.prototype.slice();</p>
<ul>
<li>const copy = 복사하고싶은객체.slice(start, end);</li>
<li>1차원 배열에서는 깊은 복사로 보이지만 2차원으로 들어가면 아님을 알 수 있다.</li>
</ul>
</li>
<li><p>Object.assign(생성할 객체, 복사할 객체);</p>
<ul>
<li>복사하고싶은면 빈배열을 넣으면됨</li>
<li>const copy = Object.assign({},복사할 객체);</li>
</ul>
</li>
<li><p>Spread 연산자 (전개 연산자)</p>
<ul>
<li>const copy = {...복사할객체}</li>
</ul>
</li>
</ul>
<h2 id="깊은-복사">깊은 복사</h2>
<p><code>깊은 복사는 원본 데이터에 영향을 미치지않게 참조가 끊어진 객체를 말한다.</code></p>
<h3 id="방식-1">방식</h3>
<ul>
<li>JSON.parse &amp;&amp; JSON.stringify<ul>
<li>객체를 JSON으로 변환 시킨 후 다시 객체로 변환</li>
<li>이 과정에서 객체가 function이면 undefined로 변환한다.</li>
<li>const copy = JSON.parse(JSON.stringify(object));</li>
</ul>
</li>
<li>재귀 함수를 구현한 복사<ul>
<li>복잡함<pre><code>function deepCopy(object) {
if (object === null || typeof object !== &quot;object&quot;) {
  return object;  
}  
// 객체인지 배열인지 판단  
const copy = Array.isArray(object) ? [] : {};   
for (let key of Object.keys(object)) {
  copy[key] = deepCopy(object[key]);
}   
return copy;
} 
const copy = deepCopy(object);</code></pre></li>
</ul>
</li>
<li>Lodash 라이브러리 사용 <ul>
<li>편함</li>
<li>코테에서는 사용 못 함</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git Flow 브랜치 전략]]></title>
            <link>https://velog.io/@yeezinu_98/Git-Flow-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EC%A0%84%EB%9E%B5</link>
            <guid>https://velog.io/@yeezinu_98/Git-Flow-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EC%A0%84%EB%9E%B5</guid>
            <pubDate>Sun, 14 Jan 2024 08:02:04 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/yeezinu_98/post/cdd691b8-3e29-46b8-968a-62e3a81ef128/image.png" alt="gitFlow">
위의 사진은 Git Flow의 전반적인 흐름을 나타내는 사진이에요.</p>
<ul>
<li><code>feature</code> - <code>develop</code> - <code>release</code> - <code>hotfix</code> - <code>main</code> 브랜치를 사용해요.</li>
<li><code>main</code> , <code>develop</code> 브랜치는 항상 배포가능한 상태로 유지해야해요.</li>
</ul>
<h3 id="branch-용도-및-생성-규칙">Branch 용도 및 생성 규칙</h3>
<ul>
<li><strong>main</strong>: 제품으로 출시될 수 있는 브랜치</li>
<li><strong>develop</strong>: 다음 출시 버전을 개발하는 브랜치</li>
<li><strong>feature</strong>: 기능을 개발하는 브랜치<ul>
<li>feature/기능 요약 </li>
<li>feature/issue-number-기능 요약</li>
</ul>
</li>
<li><strong>release</strong>: 이번 출시 버전을준비하는 브랜치<ul>
<li>release-버전 </li>
<li>release/버전</li>
</ul>
</li>
<li><strong>hotfix</strong>: 출시 버전에서 발생한 버그를 수정하는 브랜치<ul>
<li>hotfix-버전</li>
</ul>
</li>
</ul>
<p>Git Flow는 다양한 브랜치를 통해서 기능별로 세세하게 구분해서 작업할 수 있다는 장점을 가지고 있어요.</p>
<p>대신 그만큼 많은 브랜치들을 관리해야하는 단점이 있고 그에 따라 배포를 관리하는 사람이 필요하답니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git에서 branch merge 방법들과 각 방법의 특징]]></title>
            <link>https://velog.io/@yeezinu_98/Git%EC%97%90%EC%84%9C-branch-merge-%EB%B0%A9%EB%B2%95%EB%93%A4%EA%B3%BC-%EA%B0%81-%EB%B0%A9%EB%B2%95%EC%9D%98-%ED%8A%B9%EC%A7%95</link>
            <guid>https://velog.io/@yeezinu_98/Git%EC%97%90%EC%84%9C-branch-merge-%EB%B0%A9%EB%B2%95%EB%93%A4%EA%B3%BC-%EA%B0%81-%EB%B0%A9%EB%B2%95%EC%9D%98-%ED%8A%B9%EC%A7%95</guid>
            <pubDate>Sun, 14 Jan 2024 07:45:49 GMT</pubDate>
            <description><![CDATA[<p>오느레~ 뻬이파~
Git branch merge의 방법인데용~
어케하는지 정?말! 궁금해요!(아님말고 ㅋ)</p>
<p>Git에서 branch merge하는 방법은 크게 2가지가있어요</p>
<ul>
<li>git merge</li>
<li>git rebase</li>
</ul>
<p>이제 이 둘이 어떻게 다른지 함 알아보죠!</p>
<h2 id="git-merge">git merge</h2>
<pre><code class="language-JavaScript">git merge branchName</code></pre>
<p>위의 명령어로 merge를 할 수 있어요.
현재 브랜치에 branchName의 내용을 가져와서 합치는 명령어랍니다.</p>
<p>기본은 그렇고 이 <strong>merge가 세부적으로는 2개로 또 나뉘게되는데요</strong></p>
<ul>
<li>fast-foward</li>
<li>3-way-merge</li>
</ul>
<h3 id="fast-foward">fast-foward</h3>
<p>이 친구는 merge하려는 브랜치와 분기한 브랜치의 부모가 같을 때 사용됩니다.
새로운 merge commit이 생기지 않고 현재커밋에 HEAD와 브랜치를 슥 가져와요</p>
<pre><code>// branch 예시
                         /-main
o--o--o--o--o--o--o--o--o
                 /
              feat1

 이렇게 main에 feat1을 가져오려할 때 부모가 같을때는

                           /--main, feat1
 o--o--o--o--o--o--o--o--o

 이렇게 새로운 커밋을 만들지 않고 병합한다는 말입니다~
</code></pre><h3 id="3-way-merge">3-way-merge</h3>
<p>이 친구가 우리가 흔히 마주하는 merge일 듯 해요</p>
<pre><code>// 1과 2, 3이 합쳐져 4를 만들어냄
            /--o--3--/4--o--o
          /        /
o--o--o--1--o--o--2
        /
  여기가 분기점</code></pre><p>이렇게 분기를 하고 commit을 생성하면 새로운 merge commit을 만들게 되는데용</p>
<ul>
<li>base(조상)가되는 공통 커밋인 1 </li>
<li>작업 브랜치의 최신내용인 2 </li>
<li>합치려는 브랜치의 최신내용인 3</li>
</ul>
<p>이렇게 3개가 합쳐져서 새로운 커밋을 만들어 내기 때문에 3-way-merge 라고 합니다.</p>
<h2 id="git-rebase">git rebase</h2>
<pre><code>git rebase branchName</code></pre><p>기본적으로는 이렇게 사용해요.
rebase는 말 그대로 base를 다시 지정한다는 말입니다.</p>
<pre><code>// git rebase의 그래프
// 1의 base가 2로 재지정
// 이전 커밋들과 합치는 커밋이 그래프에 남지않음
            /--o--2--/3--o--o
          /       
o--o--o--o</code></pre><p>위에 git merge와는 다른 그래프가나오는걸 볼 수 있죠?
리베이스는 Git의 커밋 그래프를 깔끔하게 유지하기 위해 사용해요.</p>
<h2 id="전반적인-merge-과정">전반적인 merge 과정</h2>
<pre><code>// 과정
git rebase 브랜치이름 or git merge 브랜치이름

비상! 컨플릭트남!
수정하셈
git add.
git rebase --continue
---------------------- 
(merge라면)
git commit -m&quot; merge했어용~&quot;</code></pre><hr>
<p>워땠나용? 
이렇게 간단하게 merge의 방법과 특징을 알아봤는데용</p>
<ul>
<li>merge : merge한 이력을 남겨야 할 때<ul>
<li>fast-foward</li>
<li>3-way-merge</li>
</ul>
</li>
<li>rebase : 그래프를 깔끔하게 유지해야할 때</li>
</ul>
<p>이렇게 사용한답니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Position 속성과 특징!]]></title>
            <link>https://velog.io/@yeezinu_98/Position-%EC%86%8D%EC%84%B1%EA%B3%BC-%ED%8A%B9%EC%A7%95</link>
            <guid>https://velog.io/@yeezinu_98/Position-%EC%86%8D%EC%84%B1%EA%B3%BC-%ED%8A%B9%EC%A7%95</guid>
            <pubDate>Sat, 06 Jan 2024 11:50:38 GMT</pubDate>
            <description><![CDATA[<p>이미지는 내용과 무관하나 이름이 비슷해서 재밌어서 가져왔다.</p>
<p>2주차 위클리페이지로 Position 속성과 특징에 대해 정리하는 시간을 가져보았다.
Position 속성에는 5가지의 종류가 있다.
위치를 지정해주기위해 <code>position</code> : <code>top</code>, <code>left</code>, <code>right</code>, <code>bottom</code> 속성을 함께 사용한다.</p>
<h2 id="position-static">position: static</h2>
<p><code>position</code>설정을 입력하지 않았을 때 <strong>기초 설정 값</strong>이다. </p>
<p><code>static</code>은 <strong>HTML 문서상의 원래 배치되어야 할 위치에 배치</strong>가 된다는 말이다.
그래서 <code>top</code>, <code>left</code>, <code>right</code>, <code>bottom</code>같은 속성은 적용되지 않는다.</p>
<p>이때는 <strong>기본적인 흐름을 따라서 배치</strong>가 된다.
기본적인 흐름은 우리가 <strong>글을 읽는것과 같은 배치</strong>이다.</p>
<h2 id="position-relative">position: relative</h2>
<p><code>relative</code> 속성은 <strong>원래 본인의 위치에서 움직일 수 있게하는 속성</strong>이다.</p>
<p>즉 기본적인 <strong>문서의 흐름을 따라가되</strong>, <code>top</code>, <code>left</code>, <code>right</code>, <code>bottom</code> 같은 속성을 통해서 문서상 <strong>본인의 위치를 기반으로 위치 지정이 가능</strong>하다.</p>
<h2 id="position-absolute">position: absolute</h2>
<p><code>absolute</code> 속성은 <strong>부모 속성의 위치를 기반으로 배치하는 속성</strong>이다.</p>
<p><strong>문서의 흐름상에서 본인은 제외</strong>가 되고 자신의 부모요소에서 <code>static</code>이 아닌 다른 값을 기준으로 위치를 설정한다. 
만약 <strong>상위요소</strong>를 따라 올라갔을때 <strong><code>stitic</code>이 아닌 다른 값이 없다면 <code>body</code>를 기준</strong>으로 잡는다.
보통 <code>absolute</code>의 <strong>부모요소로 <code>relative</code>를 사용</strong>한다.</p>
<h2 id="position-fixed">position: fixed</h2>
<p><code>fixed</code> 속성은 <strong>viewport기준으로 배치하는 속성</strong>이다.</p>
<p><code>absolute</code>와 마찬가지로 <strong>문서상 흐름에서 제외</strong>되고 브라우저 화면(viewport) 기준으로 <strong><code>top</code>, <code>left</code>, <code>right</code>, <code>bottom</code>를 사용하여 위치를 설정</strong>한다.</p>
<p>보통 <code>nav바</code>가 고정적으로 보이거나 뭔가 알림같은 것을 구현할 때 사용한다.</p>
<h2 id="position-sticky">position: sticky</h2>
<p><code>sticky</code>속성은 <strong>본인의 위치에 배치</strong>가 되지만 <strong>스크롤 시 부모요소를 기준으로 배치</strong>된다. </p>
<pre><code>&lt;main&gt;
    &lt;div&gt;1&lt;/div&gt;
    &lt;div&gt;2&lt;/div&gt; // position: sticky, top:0px
    &lt;div&gt;3&lt;/div&gt;
    &lt;div&gt;4&lt;/div&gt;
&lt;/main&gt;</code></pre><p>이게 무슨말이냐면 위와 같은 코드가 있다고 가정했을 때
스크롤을 내려서 <code>&lt;div&gt;1&lt;/div&gt;</code>을 지나<code>&lt;div&gt;2&lt;/div&gt;</code>가 <code>top:0px</code>에 닿은 순간부터 main이라는 태그가 viewport에서 사라지기 전까지 적용이 되는 속성이다.</p>
<p>정리하자면 <code>sticky</code>는 부모태그가 스크롤 되어 화면밖으로 나가기 전까지 해당 부모에 <code>top</code>, <code>left</code>, <code>right</code>, <code>bottom</code>로 지정한 위치에 붙어있는 태그이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[시맨틱 태그]]></title>
            <link>https://velog.io/@yeezinu_98/%EC%8B%9C%EB%A7%A8%ED%8B%B1-%ED%83%9C%EA%B7%B8</link>
            <guid>https://velog.io/@yeezinu_98/%EC%8B%9C%EB%A7%A8%ED%8B%B1-%ED%83%9C%EA%B7%B8</guid>
            <pubDate>Sat, 06 Jan 2024 10:05:31 GMT</pubDate>
            <description><![CDATA[<p>코드잇 2주차 위클리 페이퍼로 시맨틱 태그를 사용하면 좋은 점에 대해 설명을 하게 되었다.
이번 기회에 시맨틱 태그는 무엇이며 왜 써야 하는지 알아보자. </p>
<h2 id="시맨틱-이란">시맨틱 이란?</h2>
<p>우선 시맨틱이라는 말부터 알아보자. <code>Semantics</code>은 <code>의미론</code>이라는 사전적인 의미를 가진다.</p>
<pre><code>&lt;h1&gt;
    Hello World!
&lt;/h1&gt;

&lt;span style=&quot;font-size: 32px; margin: 21px 0;&quot;&gt;
    Hello World!
&lt;/span&gt;</code></pre><p>위 코드에서 <code>&lt;h1&gt;</code>태그와 <code>&lt;p&gt;</code>태그는 모양은 동일하다.
그러나 각 태그가 의미하는 것은 다르다.</p>
<ul>
<li>h1: 이 페이지에서 최상위 제목</li>
<li>p : 문단 (제목이라는 의미는 없음)</li>
</ul>
<p>이처럼 각 태그들은 의미를 가지고 있다. 
이제 왜 태그를 목적에 맞게 사용해야 하는지 알아보자.</p>
<h2 id="왜-써야하나">왜 써야하나?</h2>
<p>물론 그냥 div태그, p태그에 스타일을 줘서 모든 화면을 그릴 수는 있다.
하지만 시맨틱 태그를 사용했을 때의 이점은 다음과 같다.</p>
<ol>
<li><p><code>웹 접근성</code>이 좋아진다.</p>
<ul>
<li>시각 장애가 있는 사용자가 화면 판독기로 페이지를 탐색할 때 의미론적 마크업을 푯말로 사용할 수 있다.</li>
</ul>
</li>
<li><p><code>코드 가독성</code>이 상승하고 유지보수에 좋다.</p>
<ul>
<li>의미없는 div 들을 탐색하는 것보다 의미있는 코드 블록을 찾는 것이 훨씬 쉽다.</li>
</ul>
</li>
<li><p><code>검색 엔진 최적화(SEO)</code>에 유리하다.</p>
<ul>
<li>검색 엔진은 의미론적 마크업을 페이지의 검색 랭킹에 영향을 줄 수 있는 중요한 키워드로 간주한다.</li>
</ul>
</li>
</ol>
<h2 id="종류는">종류는?</h2>
<p>종류는 약 100여 가지로 생각보다 상당히 다양하다.
그중 일부만 알아보자.</p>
<p><code>&lt;header&gt;</code> : <strong>소개 및 탐색에 도움을 주는 콘텐츠</strong>를 나타냅니다. 
(제목, 로고, 검색 폼, 작성자 이름 등)</p>
<p><code>&lt;nav&gt;</code> : 현재 페이지 내, 또는 다른 페이지로의 링크를 보여주는 <strong>네비게이션</strong>이다. 
(메뉴, 목차, 색인)</p>
<p><code>&lt;main&gt;</code> : 문서 <code>&lt;body&gt;</code>의 <strong>주요 콘텐츠</strong>를 나타냅니다.</p>
<p><code>&lt;article&gt;</code> : 문서, 페이지, 애플리케이션, 또는 사이트 안에서 <strong>독립적으로 구분되는 요소</strong>에 사용됩니다. 
(게시판과 블로그 글, 매거진이나 뉴스 기사 등)</p>
<p><code>&lt;section&gt;</code> : 보통 <strong>제목을 포함하고있으며 독립적인 요소나 문서 요약에 사용</strong>된다. <strong>일반적인 컨테이너</strong>를 위한것이라면 <strong><code>&lt;div&gt;</code>를 사용하는것이 권장</strong> 된다.
<code>&lt;figuer&gt;</code> : <strong>이미지가 들어가는 영역</strong>이다.
<code>&lt;aside&gt;</code> : 문서의 좌 혹은 우측의 <strong>사이드 공간</strong>을 의미 <strong>주요 컨텐츠 이외에 참고가 되는 정보</strong>를 배치한다.
<code>&lt;footer&gt;</code> : 바닥글, 문서 하단에 들어가는 정보로, <strong>사이트의 제작자나 저작권 정보</strong> 등을 주로 표시</p>
<blockquote>
<p>mdn 시맨틱태그 <a href="https://developer.mozilla.org/ko/docs/Glossary/Semantics#html_%EC%8B%9C%EB%A7%A8%ED%8B%B1">https://developer.mozilla.org/ko/docs/Glossary/Semantics#html_%EC%8B%9C%EB%A7%A8%ED%8B%B1</a></p>
</blockquote>
<blockquote>
<p>mdn 태그 목록
<a href="https://developer.mozilla.org/ko/docs/Web/HTML/Element">https://developer.mozilla.org/ko/docs/Web/HTML/Element</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS의 Cascading]]></title>
            <link>https://velog.io/@yeezinu_98/CSS%EC%9D%98-Cascading</link>
            <guid>https://velog.io/@yeezinu_98/CSS%EC%9D%98-Cascading</guid>
            <pubDate>Sun, 31 Dec 2023 06:02:39 GMT</pubDate>
            <description><![CDATA[<p><code>Cascading</code>이란 사전적인 의미로 종속, 작은 폭포를 의미합니다.
CSS에서 Cascading이 왜 중요한지 알아봅시다.</p>
<hr>
<h1 id="css와-cascading">CSS와 Cascading</h1>
<p><code>CSS</code>는 <code>Cascading Style Sheet</code>의 약어입니다.
그만큼 CSS와 Cascading은 떼어놓을 수 없는 관계라는 것을 알 수 있습니다.</p>
<p>CSS를 작성하다보면 상속되거나 중첩되는 상황이 많이 나오게 되는데 이때 2가지 원칙에 따라서 어떤 스타일을 적용할지 결정됩니다.</p>
<ol>
<li>스타일 우선순위</li>
<li>스타일 상속</li>
</ol>
<h1 id="스타일-우선순위">스타일 우선순위</h1>
<p>스타일 우선순위는 크게 3가지로 분류됩니다.</p>
<ol>
<li>중요도</li>
<li>명시도</li>
<li>코드 순서</li>
</ol>
<h2 id="중요도">중요도</h2>
<p>스타일을 선언한 사람에 따라 우선순위를 높이는것을 말합니다. </p>
<p>1순위: 사용자가 만든 스타일 시트 
2순위: 제작사가 만든 !important 스타일
3순위: 제작자가 만든 일반 스타일
4순위: 브라우저 기본 스타일시트 (User Agent StyleSheet)</p>
<h2 id="명시도">명시도</h2>
<p>셀렉터가 가리키는것이 명확할수록 우선순위를 높이는것을 말합니다. </p>
<p>1순위: 인라인 스타일
2순위: ID스타일
3순위: Class 스타일
4순위: Tag 스타일
<a href="https://specificity.keegan.st/">CSS 명시도 계산기</a></p>
<h2 id="코드순서">코드순서</h2>
<p>맨 마지막에 선언한 CSS일 수록 우선순위를 더 높게 주는것을 말합니다.</p>
<hr>
<h1 id="스타일-상속">스타일 상속</h1>
<pre><code>&lt;div id=&quot;부모&quot;&gt;
    &lt;div id =&quot;자식&quot;&gt;&lt;/div&gt;
&lt;/div&gt;</code></pre><p>스타일 상속은 부모태그의 스타일이 자식태그에도 적용되는 현상을 말합니다.
부모태그와 자식태그는 위의 코드를 참고하면 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Pricy 웹 버전 만들기~!]]></title>
            <link>https://velog.io/@yeezinu_98/Pricy-%EC%9B%B9-%EB%B2%84%EC%A0%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@yeezinu_98/Pricy-%EC%9B%B9-%EB%B2%84%EC%A0%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 16 Jan 2023 17:15:40 GMT</pubDate>
            <description><![CDATA[<h1 id="개발일기-1일차">개발일기 1일차!</h1>
<hr>
<h3 id="사실-별-생각이-없었는데">사실 별 생각이 없었는데...</h3>
<blockquote>
<p>그렇다 사실 개발일기 같은건 생각을 안해봤다.</p>
</blockquote>
<h3 id="그런데왜">그런데...왜?</h3>
<blockquote>
<p>내가 어떤 과정을 거쳤는지 성장 과정을 보고 싶어서~
그렇다면? 자 드가자~</p>
</blockquote>
<h3 id="도전의-시작">도전의 시작</h3>
<blockquote>
<p>왜 와이 갑자기? 
최근 지인에게 어케 해야 개발자로서 성공 할 수 있을까? 하는 질문을 했었는데 답변으로
생각할 시간에 움직이라는 말과 일단 하라는 말을 들어서 일단 해보려고한다. 
</br>개인 프로젝트를 한번도 진행해 본적이 없어서 한번 진행해 보려고한다. 
물론 처음이라 여러가지 문제가 있을 듯하나 그래도 도전하다보면 개선될 것이라고 생각한다.</p>
</blockquote>
<h3 id="레포-생성">레포 생성</h3>
<blockquote>
<p>처음부터 문제가 생겼다. 
레포를 만들어야되는데 갑자기 라이센스를 선택하라 해서 ??? 이건 처음보는데요 선생님? 
바로 구글링! 굿 </p>
</blockquote>
<p>결과: React, Angular, Vue 모두 MIT 라이선스라고 하더라 / 남이 상업용으로 써도 상관없다면? MIT써도 된다~
<a href="https://flyingsquirrel.medium.com/github-license%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%EB%82%98%EC%97%90%EA%B2%8C-%EB%A7%9E%EB%8A%94-%EB%9D%BC%EC%9D%B4%EC%84%A0%EC%8A%A4-%EC%84%A0%ED%83%9D%ED%95%98%EA%B8%B0-ae29925e8ff4">라이센스 관련 참고 글</a></p>
<h3 id="git-pull">git pull</h3>
<blockquote>
<p>생성하자 마자 바로 다음 문제 봉착!
내 레포를 어떻게 보여주지?
</br>바로 프로젝트 폴더를 보여줘야할까?
아니면 GDSC에서 했던 것 처럼 파일을 한번 더 감싸서 보여줄까?
</br> 고민끝의 결과: 그냥 GDSC에서 했던 것 처럼 해보자~
다음에 할때 다른방식으로 해보면 되지~</p>
</blockquote>
<h3 id="프로젝트-생성">프로젝트 생성</h3>
<blockquote>
<p>과거의 나! 이거  해보고싶었구나! 
프로젝트를 만들려고 했는데 이미 프로젝트가 생성이 되어있었다. 물론 생성만 해뒀음...
</br>여튼 가보자고!
기본 세팅 후 <code>npm run dev</code>를 하면서 외쳐보자 랑데부!
</br> 왜...? 저런 주문을? 
그 이유는 <code>npm dev run</code>과 <code>npm run dev</code>를 헷갈려 했기에 가장 쉽게 외운 방법이 랑데부였음 ㅇㅇ
저거 한 뒤로 안헷갈림 !
헷갈린다면? 랑데부를 외쳐 보아요</p>
</blockquote>
<h3 id="레이아웃-짜기">레이아웃 짜기</h3>
<blockquote>
<p>막상 생성했는데 생각해보니까 어떻게 보여줄지는 생각 안해봤넹...
자 피그마 드가자<del>~
</br> 아마 KAMIS랑 비슷하게 짤듯?
그러면 참고하러 드가자</del></p>
</blockquote>
<h3 id="일단-고">일단? 고!</h3>
<blockquote>
<p>헉 레이아웃짜려고 KAMIS들어갔다가 몇 가지 아이디어가 떠올랐다.
뭘 보여주고 싶지??</p>
</blockquote>
<ol>
<li>오늘의 시장 물가 -&gt; 우리는 소매가 중요하니 소매가로! </li>
<li>월별 물가 추이 -&gt; 클릭 시 페이지 이동 or modal에 hover해서 보여주기!</li>
<li>알뜰 장보기 -&gt; 이거좀 히트임 이거는 보니까 <code>img</code>파일들 넣어둔거라서 링크 쏘는게 좋을 듯!</li>
<li>아! 짜피 알뜰 장보기에서 다 하니까 나는 품목 고르면 장바구니 담기 같은 기능을 써보자!</li>
</ol>
<h3 id="오늘은-여기까지">오늘은? 여기까지~</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[axios설치 및 .env 사용 방법]]></title>
            <link>https://velog.io/@yeezinu_98/axios%EC%84%A4%EC%B9%98-%EB%B0%8F-.env-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@yeezinu_98/axios%EC%84%A4%EC%B9%98-%EB%B0%8F-.env-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Thu, 22 Dec 2022 09:02:56 GMT</pubDate>
            <description><![CDATA[<h3 id="yarn을-이용한-axios-설치">yarn을 이용한 axios 설치</h3>
<pre><code>yarn add axios
yarn add @types/axios -D</code></pre><p>또는</p>
<h3 id="npm을-이용한-axios-설치">npm을 이용한 axios 설치</h3>
<pre><code>npm install axios
npm install --save-dev @types/axios</code></pre><hr>
<h3 id="보안을-위해-env-파일-생성">보안을 위해 .env 파일 생성</h3>
<p>프로젝트에 .env파일 생성 후 .gitignoro에 .env추가</p>
<p>이정도까지가 api를 사용하기 위한 기초 준비이다.</p>
<hr>
<h3 id="env-사용방법">.env 사용방법</h3>
<p>.ts</p>
<p><img src="https://velog.velcdn.com/images/yeezinu_98/post/b39382a2-d9b9-456f-a6da-54d82500c547/image.png" alt=""></p>
<p>process.env(변수명)을 사용하면 .env에 선언한 api키값을 가져올 수 있다.
</br></p>
<p>.env
<img src="https://velog.velcdn.com/images/yeezinu_98/post/bf5398a1-d40c-4756-9168-cffe81e8b129/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>