<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>kor-seonwoo.log</title>
        <link>https://velog.io/</link>
        <description>프론트엔드 개발 공부중인 주니어 개발자의 복습노트</description>
        <lastBuildDate>Fri, 10 Nov 2023 04:42:03 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>kor-seonwoo.log</title>
            <url>https://velog.velcdn.com/images/kor-seonwoo/profile/2af402f5-c979-40b5-95de-b5982c15be24/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. kor-seonwoo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kor-seonwoo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[CS - 자료구조] 힙(heap)]]></title>
            <link>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%9E%99heap</link>
            <guid>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%9E%99heap</guid>
            <pubDate>Fri, 10 Nov 2023 04:42:03 GMT</pubDate>
            <description><![CDATA[<h2 id="-힙heap">#. 힙(heap)</h2>
<hr>
<h3 id="1-힙heap이란">##1. 힙(heap)이란?</h3>
<p><strong>힙(heap)</strong> 은 <strong>최댓값</strong> 및 <strong>최솟값</strong>을 찾아내는 연산을 빠르게 하기 위해 고안된 <strong>완전이진트리(complete binary tree) 를 기본으로 한 자료구조</strong>이다.
부모 노드가 자식 노드보다 크거나 같은 완전 이진 트리를 <strong>최대 힙, Max Heap</strong>,
부모 노드가 자식 노드보다 작거나 같은 완전 이진 트리를 <strong>최소 힙, Min Heap</strong> 으로 구분할 수 있다.</p>
<hr>
<h3 id="2-힙heap의-특징">##2. 힙(heap)의 특징</h3>
<ul>
<li>힙은 &#39;<strong>완전 이진 트리</strong>&#39; 형태를 가진다. </li>
<li>힙의 <strong>부모 노드는 자식 노드보다 크거나 같은 값을 가진다</strong>.</li>
<li>힙은 <strong>루트 노드</strong>가 <strong>최댓값(최대 힙의 경우)</strong> 또는 <strong>최솟값(최소 힙의 경우)</strong>을 가진다.</li>
<li>힙은 <strong>배열로 표현</strong>할 수 있다.</li>
<li>힙은 <strong>중복을 허용</strong>한다.</li>
</ul>
<hr>
<h3 id="3-힙heap의-장점과-단점">##3. 힙(heap)의 장점과 단점</h3>
<h4 id="31-장점">##3.1 장점</h4>
<p>힙은 최대값 또는 최소값을 찾아내는 연산을 빠르게 수행할 수 있다. 이는 우선순위 큐와 같은 추상적 자료형의 구현에 매우 유용하다.</p>
<h4 id="32-단점">##3.2 단점</h4>
<p>힙은 정렬된 구조가 아니므로, 특정 값을 검색하는데는 적합하지 않다.</p>
<hr>
<h3 id="4-힙heap의-동작">##4. 힙(heap)의 동작</h3>
<h4 id="41-구현">###4.1 구현</h4>
<ul>
<li><strong>insert</strong> : 힙에 새로운 요소를 추가한다.</li>
<li><strong>delete</strong> : 힙에서 가장 큰 요소를 제거한다.</li>
<li><strong>peek</strong> : 힙에서 가장 큰 요소를 반환한다.</li>
<li><strong>size</strong> : 힙의 크기를 반환한다.</li>
<li><strong>isEmpty</strong> : 힙이 비어있는지 확인한다.</li>
<li><strong>maxHeapify</strong> : 힙의 특성을 유지한다.</li>
</ul>
<h4 id="42-삽입">###4.2 삽입</h4>
<ol>
<li>새로운 요소를 힙의 마지막 노드에 추가</li>
<li>추가된 새로운 노드를 부모 노드와 비교하여 </li>
</ol>
<p><strong>추가된 노드가 부모 노드 보다 크다면</strong>, 위치를 교환한다.
<strong>추가된 노드가 부모 노드 보다 작거나 같다면</strong>, 삽입을 종료한다.</p>
<h4 id="43-삭제">###4.3 삭제</h4>
<p>최대값을 알아내 삭제하기 위해서는</p>
<ol>
<li>힙의 <strong>루트 노드를 삭제</strong>한 후, 힙의 <strong>마지막 노드를 루트 노드 자리로 이동</strong>한다.</li>
<li>루트 노드와 자식 노드를 비교하여</li>
</ol>
<p><strong>루트 노드가 자식 노드 보다 작다면</strong>, <strong>자식 노드 중 가장 큰 노드</strong>와 위치를 교환한다.
<strong>루트 노드가 크다면</strong>, 삭제를 종료한다.</p>
<h4 id="44-heapify">###4.4 Heapify</h4>
<p>위의 삽입과 삭제 수행 과정에서 <strong>구조의 변화로 인해 힙의 속성이 깨질 수 있기 때문에</strong>
위치를 교환하며 힙의 재구조화를 수행하는 Heapify 메서드를 사용한다.</p>
<hr>
<h3 id="5-힙heap의-사용">##5. 힙(heap)의 사용</h3>
<h4 id="51-우선순위-큐">###5.1 우선순위 큐</h4>
<p>힙은 우선순위 큐 구현에 가장 일반적으로 사용되는 자료구조이다.</p>
<h4 id="52-힙-정렬">###5.2 힙 정렬</h4>
<p>힙은 힙 정렬(Heap Sort)이라는 효율적인 정렬 알고리즘에 사용된다.</p>
<h4 id="53-그래프-알고리즘">###5.3 그래프 알고리즘</h4>
<p>힙은 최소 신장 트리를 찾는 프림 알고리즘, 최단 경로를 찾는 다익스트라 알고리즘 등의 그래프 알고리즘에서 활용된다.</p>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://codingmoon.io/posts/data-structure-algorithms/heap/">https://codingmoon.io/posts/data-structure-algorithms/heap/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS - 자료구조] 트리(tree)]]></title>
            <link>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8A%B8%EB%A6%AC</link>
            <guid>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8A%B8%EB%A6%AC</guid>
            <pubDate>Thu, 09 Nov 2023 09:53:39 GMT</pubDate>
            <description><![CDATA[<h2 id="-트리tree">#. 트리(tree)</h2>
<hr>
<h3 id="1-트리tree란">##1. 트리(tree)란?</h3>
<p>트리는 컴퓨터 과학에서 중요한 자료구조 중 하나로, <strong>노드들이 edge로 연결된 계층적 구조</strong>를 가진다. 
트리의 최상위 노드를 루트 노드라고 하며, 나머지 노드들은 부모-자식 관계를 가지며 서로 연결된다.</p>
<hr>
<h3 id="2-트리tree의-특징">##2. 트리(tree)의 특징</h3>
<ul>
<li><strong>계층적인 구조</strong>: 트리는 자료들 사이의 <strong>계층관계를 나타내는 데 적합</strong>하다.</li>
<li><strong>루트 노드</strong>: 트리의 <strong>최상위에 위치한 노드</strong>로, 트리는 루트 노드에서 시작한다.</li>
<li><strong>부모-자식 관계</strong>: 트리의 노드들은 부모-자식 관계를 가지며, 각 노드는 하나의 부모 노드와 여러 개의 자식 노드를 가질 수 있다. 이러한 노드들은 edge로 연결된다.</li>
</ul>
<hr>
<h3 id="3-트리tree의-구조">##3. 트리(tree)의 구조</h3>
<h4 id="31-용어">###3.1 용어</h4>
<ul>
<li><p><strong>root</strong> : 트리 최상위 노드</p>
</li>
<li><p><strong>edge</strong> : 노드와 노드를 연결하는 선</p>
</li>
<li><p><strong>parent</strong> : 자식 노드를 보유한 노드</p>
</li>
<li><p><strong>child</strong> : 부모 노드의 하위 노드</p>
</li>
<li><p><strong>sibling</strong> : 같은 부모 노드를 가진 동일 선상의 노드</p>
</li>
<li><p><strong>leaf</strong> : 트리 최하단 노드</p>
</li>
<li><p><strong>size</strong> : 모든 노드들의 개수 (root 포함)</p>
</li>
<li><p><strong>depth</strong> : 선택한 노드에서 root까지의 거리</p>
</li>
<li><p><strong>height</strong> : 선택한 노드에서 leaf 노드까지 가장 긴 경로에 있는 edge의 개수</p>
</li>
</ul>
<h4 id="32-종류">###3.2 종류</h4>
<ul>
<li><strong>편향 트리</strong><blockquote>
<ul>
<li>모든 노드들이 하나의 자식 노드만 가지는 트리</li>
</ul>
</blockquote>
</li>
<li><strong>이진 트리 (binary tree)</strong><blockquote>
<ul>
<li>부모 노드 밑의 자식 노드 개수를 최대 2개로 제한하는 형태</li>
<li>노드의 값, 데이터 크기 등과 상관없이 구성된다.</li>
</ul>
</blockquote>
</li>
<li><strong>이진 탐색 트리 (binary search tree)</strong><blockquote>
<ul>
<li>부모 노드를 기준으로 왼쪽 자식은 부모보다 작은 값, 오른쪽 자식은 부모보다 큰 값을 가진다.</li>
</ul>
</blockquote>
<h4 id="33-순회">###3.3 순회</h4>
</li>
<li><strong>중위 순회 (in-order traversal)</strong><blockquote>
<p>left → visit → right</p>
</blockquote>
</li>
<li><strong>전위 순회 (pre-order traversal)</strong><blockquote>
<p>visit → left → right</p>
</blockquote>
</li>
<li><strong>후위 순회 (post-order traversal)</strong><blockquote>
<p>left → right → visit</p>
</blockquote>
</li>
</ul>
<hr>
<h3 id="4-트리tree의-장점과-단점">##4. 트리(tree)의 장점과 단점</h3>
<h4 id="41-장점">###4.1 장점</h4>
<p>데이터를 계층적이고 직관적으로 표현할 수 있어, 데이터 검색과 정렬, 삽입, 삭제 등의 연산이 효율적이다.</p>
<h4 id="42-단점">###4.2 단점</h4>
<p>트리의 구조가 복잡하여 설계와 구현이 어렵고, 데이터의 추가나 삭제에 따라 트리의 구조를 재조정해야 할 수도 있다.</p>
<hr>
<h3 id="5-트리tree의-사용">##5. 트리(tree)의 사용</h3>
<p>트리는 데이터를 계층적이고 직관적으로 표현할 수 있어, 데이터의 관계를 이해하기 쉽고, 데이터 검색과 정렬, 삽입, 삭제 등의 연산이 효율적이다.</p>
<h4 id="51-웹-페이지-렌더링">##5.1 웹 페이지 렌더링</h4>
<p>웹 페이지는 HTML 태그의 계층적 구조를 가지는 DOM (Document Object Model) 트리를 사용하여 렌더링된다.</p>
<h4 id="52-프로그래밍-언어의-구문-분석">##5.2 프로그래밍 언어의 구문 분석</h4>
<p>프로그래밍 언어의 컴파일러는 소스 코드를 분석하고 실행하기 위해 구문 트리(Syntax tree)를 사용한다.</p>
<h4 id="53-데이터베이스">##5.3 데이터베이스</h4>
<p>데이터베이스 관리 시스템(DBMS)에서는 B-트리, B+ 트리 등의 트리 구조를 사용하여 데이터를 효율적으로 관리한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS - 자료구조] 연결 리스트]]></title>
            <link>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%97%B0%EA%B2%B0-%EB%A6%AC%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%97%B0%EA%B2%B0-%EB%A6%AC%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Tue, 07 Nov 2023 09:55:54 GMT</pubDate>
            <description><![CDATA[<h2 id="-연결-리스트">#. 연결 리스트</h2>
<hr>
<h3 id="1-연결-리스트란">##1. 연결 리스트란?</h3>
<p>연결 리스트는 데이터 요소들을 <strong>노드(Node)로 구성</strong>하고, <strong>각 노드</strong>가 <strong>데이터</strong>와 다음 노드를 가리키는 <strong>링크(포인터)</strong>를 가지는 자료구조이다. 
각 노드는 메모리에서 <strong>불연속적으로 할당</strong>되며, <strong>링크(포인터)를 통해 서로 연결되어 있는 특징</strong>을 가지고 있다.</p>
<hr>
<h3 id="2-연결-리스트의-특징">##2. 연결 리스트의 특징</h3>
<ul>
<li><p>연결 리스트는 데이터 요소들을 <strong>순차적으로 저장하지 않고</strong>, 각 노드가 <strong>링크를 통해 서로 연결</strong>되어 있기 때문에 <strong>데이터의 삽입과 삭제가 유연</strong>하게 이루어진다.</p>
</li>
<li><p>연결 리스트는 <strong>크기를 동적으로 조정</strong>할 수 있으며, 메모리 공간을 효율적으로 사용할 수 있다.</p>
</li>
<li><p>하지만 연결 리스트는 특정 위치의 데이터에 접근하기 위해서는 <strong>처음부터 순회해야 하므로, 탐색에는 선형 시간이 소요</strong>된다.</p>
</li>
</ul>
<hr>
<h3 id="3-연결-리스트의-종류">##3. 연결 리스트의 종류</h3>
<h4 id="31-단일-연결-리스트singly-linked-list">###3.1 단일 연결 리스트(Singly Linked List)</h4>
<p>각 노드는 <strong>데이터</strong>와 <strong>다음 노드를 가리키는 링크(포인터)</strong>로 <strong>구성</strong>되어 있다.</p>
<blockquote>
<p>노드1(head) = data, next(<strong>노드2를 가리킴</strong>)
노드2 = data, next(<strong>노드3을 가리킴</strong>)
노드3(tail) = data, next(<strong>다음 노드가 없다면 null</strong>)</p>
</blockquote>
<h4 id="32-이중-연결-리스트doubly-linked-list">###3.2 이중 연결 리스트(Doubly Linked List)</h4>
<p>각 노드는 <strong>데이터</strong>와 <strong>이전 노드를 가리키는 링크(포인터)</strong>, <strong>다음 노드를 가리키는 링크(포인터)</strong>로 구성되어 있다. 이중 연결 리스트는 <strong>양방향으로 탐색이 가능</strong>하므로 탐색의 효율성이 높아진다.</p>
<blockquote>
<p>노드1(head) = data, prev(<strong>이전 노드가 없다면 null</strong>), next(<strong>노드2를 가리킴</strong>)
노드2 = data, prev(<strong>노드1을 가리킴</strong>), next(<strong>노드3을 가리킴</strong>)
노드3(tail) = data, prev(<strong>노드2을 가리킴</strong>), next(<strong>다음 노드가 없다면 null</strong>)</p>
</blockquote>
<h4 id="33-원형-연결-리스트circular-linked-list">###3.3 원형 연결 리스트(Circular Linked List)</h4>
<p><strong>마지막 노드가 첫 번째 노드를 가리키는 링크(포인터)</strong>를 가지는 연결 리스트이다. 
원형으로 연결되어 있기 때문에 <strong>마지막 노드에서 첫 번째 노드로 순회할 수 있다</strong>.</p>
<blockquote>
<p>노드1(head) = data, next(<strong>노드2를 가리킴</strong>)
노드2 = data, next(<strong>노드3을 가리킴</strong>)
노드3(tail) = data, next(<strong>다음 노드가 없다면 노드1을 가리킴</strong>)</p>
</blockquote>
<hr>
<h3 id="4-연결-리스트의-장점과-단점">##4. 연결 리스트의 장점과 단점</h3>
<h4 id="41-장점">###4.1 장점</h4>
<ul>
<li>데이터의 삽입과 삭제가 유연하게 이루어질 수 있다.</li>
<li><strong>크기를 동적으로 조정</strong>할 수 있어 메모리 공간을 효율적으로 사용 가능하다.<h4 id="42-단점">###4.2 단점</h4>
</li>
<li><strong>특정 위치의 데이터에 접근하기 위해서</strong>는 <strong>처음부터 순회</strong>해야 하므로 탐색에는 선형 시간이 소요된다.</li>
<li><strong>포인터의 추가적인 메모리 공간이 필요</strong>하다.</li>
</ul>
<hr>
<h3 id="5-연결-리스트의-시간-복잡도">##5. 연결 리스트의 시간 복잡도</h3>
<p>데이터의 삽입과 삭제: <code>O(1)의 시간 복잡도</code>를 가진다.
데이터의 탐색과 접근: <code>O(n)의 시간 복잡도</code>를 가진다. (단일 연결 리스트의 경우)</p>
<hr>
<h3 id="6-연결-리스트의-사용">##6. 연결 리스트의 사용</h3>
<h4 id="61-데이터의-동적-추가와-삭제">###6.1 데이터의 동적 추가와 삭제</h4>
<p>연결 리스트는 데이터의 삽입과 삭제가 유연하게 이루어질 수 있다. 
데이터를 삽입하거나 삭제할 때, 해당 위치의 노드의 링크만 변경하면 되기 때문에 다른 요소들에 영향을 주지 않고 연결 리스트를 수정할 수 있다.</p>
<h4 id="62-파일-관리">###6.2 파일 관리</h4>
<p>파일 시스템에서는 파일들의 정보를 연결 리스트로 관리하기도 한다. 
각 파일을 노드로 표현하고, 링크로 연결하여 파일들을 관리할 수 있다. 이를 통해 파일의 추가, 삭제, 탐색 등을 효율적으로 수행할 수 있다.</p>
<h4 id="63-큐queue와-스택stack의-구현">###6.3 큐(Queue)와 스택(Stack)의 구현</h4>
<p>연결 리스트를 활용하여 큐와 스택을 구현할 수 있다. 
큐의 경우, 데이터를 연결 리스트의 끝에 추가하고, 삭제는 맨 앞에서 진행한다. 
스택의 경우, 데이터를 연결 리스트의 맨 앞에 추가하고, 삭제도 맨 앞에서 진행한다.</p>
<h4 id="64-문자열-처리">###6.4 문자열 처리</h4>
<p>연결 리스트는 문자열 처리에 유용하게 사용될 수 있다. 
문자열을 문자 단위로 분리하여 각 문자를 노드로 표현하고, 링크로 연결하여 문자열을 저장하거나 조작할 수 있다. 이를 통해 문자열의 삽입, 삭제, 역순 등 다양한 연산을 수행할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS - 자료구조] 큐(Queue)]]></title>
            <link>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%81%90</link>
            <guid>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%81%90</guid>
            <pubDate>Mon, 06 Nov 2023 07:01:02 GMT</pubDate>
            <description><![CDATA[<h2 id="-큐queue">#. 큐(Queue)</h2>
<hr>
<h3 id="1-큐queue란">##1. 큐(Queue)란?</h3>
<p>큐는 <strong>FIFO(First In First Out)</strong> 원칙을 따르는 자료구조이다. 
즉, <strong>가장 먼저 들어온 데이터가 가장 먼저 나가는 구조</strong>를 가진다. 일상생활에서 줄을 서는 것을 생각하면 이해하기 쉽다.</p>
<hr>
<h3 id="2-큐queue의-특징">##2. 큐(Queue)의 특징</h3>
<ul>
<li><p>데이터의 삽입과 삭제가 <strong>각각 다른 방향</strong>에서 이루어진다. 
데이터는 <strong>뒤쪽(rear)에서 삽입</strong>되고, <strong>앞쪽(front)에서 삭제</strong>된다.</p>
</li>
<li><p>데이터의 입력 순서를 유지한다. 
들어온 순서대로 데이터가 저장되며, 먼저 들어온 데이터부터 차례대로 나갑니다.</p>
</li>
<li><p>종류로는 선형과 원형이 있다.</p>
</li>
</ul>
<hr>
<h3 id="3-큐queue의-장점과-단점">##3. 큐(Queue)의 장점과 단점</h3>
<h4 id="31-장점">##3.1 장점</h4>
<p>데이터의 삽입과 삭제가 각각 다른 방향에서 이루어지므로 구현이 간단하고, 데이터를 관리하기 쉽다.</p>
<h4 id="32-단점">##3.2 단점</h4>
<p>선형 큐는 데이터를 Dequeue하면서 생기는 <strong>빈 공간을 재활용하지 못하는 단점</strong>이 있다. 
이로 인해 메모리 사용이 비효율적이며, 큐가 가득 찼다는 오류 메시지를 받을 수 있음에도 불구하고 실제로는 사용되지 않는 메모리 공간이 있을 수 있다. 이러한 단점을 해결하기 위해 <strong>원형 큐(Circular Queue)</strong>가 도입되었다.</p>
<hr>
<h3 id="4-큐queue의-추상자료형">##4. 큐(Queue)의 추상자료형</h3>
<h4 id="41-enqueue">##4.1 Enqueue</h4>
<p>큐의 <strong>뒤쪽(rear)에 데이터를 추가</strong>하는 연산이다.</p>
<h4 id="42-dequeue">##4.2 Dequeue</h4>
<p>큐의 <strong>앞쪽(front)에서 데이터를 제거</strong>하고, 그 <strong>데이터를 반환</strong>하는 연산이다.</p>
<h4 id="43-frontpeek">##4.3 Front/Peek</h4>
<p>큐의 <strong>앞쪽(front)의 데이터를 조회</strong>하는 연산이다. </p>
<h4 id="44-isempty">##4.4 isEmpty</h4>
<p>큐가 <strong>비어있는지 확인</strong>하는 연산이다.</p>
<h4 id="45-isfull">##4.5 isFull</h4>
<p>큐가 가<strong>득 차 있는지 확인</strong>하는 연산이다.</p>
<hr>
<h3 id="5-큐queue의-시간복잡도">##5. 큐(Queue)의 시간복잡도</h3>
<p>큐의 주요 연산인 Enqueue(삽입)과 Dequeue(삭제) 모두 <code>O(1)의 시간복잡도</code>를 가진다.</p>
<hr>
<h3 id="6-큐queue의-종류">##6. 큐(Queue)의 종류</h3>
<h4 id="61-선형-큐-linear-queue">###6.1 선형 큐 (Linear Queue)</h4>
<p><img src="https://velog.velcdn.com/images/kor-seonwoo/post/42f13fdc-091b-4cf7-a553-e7bedc94ead5/image.png" alt=""> <a href="https://yoongrammer.tistory.com/46">이미지 출처</a></p>
<h4 id="62-원형-큐-circular-queue">###6.2 원형 큐 (Circular Queue)</h4>
<p><img src="https://velog.velcdn.com/images/kor-seonwoo/post/66fdf2d5-f899-49fe-96cf-3b647c3b1494/image.png" alt=""> <a href="https://yoongrammer.tistory.com/46">이미지 출처</a></p>
<hr>
<h3 id="7-큐queue의-사용">##7. 큐(Queue)의 사용</h3>
<h4 id="71-버퍼">###7.1 버퍼</h4>
<p>데이터가 임시로 저장되는 중간 메모리 영역인 버퍼 구현에 큐가 사용된다.</p>
<h4 id="72-너비-우선-탐색bfs">###7.2 너비 우선 탐색(BFS)</h4>
<p>그래프 탐색 알고리즘인 너비 우선 탐색에서 큐가 사용된다</p>
<h4 id="73-캐시-구현">###7.3 캐시 구현</h4>
<p>최근에 참조된 항목을 저장하는 캐시에서 큐가 사용된다.</p>
<h4 id="74-프린터의-인쇄-작업-관리-등">###7.4 프린터의 인쇄 작업 관리 등</h4>
<p>여러 작업을 순차적으로 실행해야 할 때 큐가 사용된다.</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS - 자료구조] 스택(Stack)]]></title>
            <link>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9D</link>
            <guid>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9D</guid>
            <pubDate>Fri, 03 Nov 2023 09:29:52 GMT</pubDate>
            <description><![CDATA[<h2 id="-스택stack">#. 스택(Stack)</h2>
<hr>
<h3 id="1-스택stack이란">##1. 스택(Stack)이란?</h3>
<p>스택은 <strong>LIFO(Last In First Out)</strong> 원칙을 따르는 자료구조이다. 
즉, <strong>가장 마지막에 들어온 데이터가 가장 먼저 나가는 구조</strong>를 가진다. 생활에서 책을 쌓아두는 모습이나, 식당에서 접시를 쌓아두는 것을 생각하면 이해하기 쉽다.</p>
<hr>
<h3 id="2-스택의-특징">##2. 스택의 특징</h3>
<ul>
<li><p>데이터의 삽입과 삭제가 <strong>한 방향</strong>(스택의 맨 위 혹은 맨 아래)에서만 일어난다.</p>
</li>
<li><p>데이터의 입력 순서를 유지한다. 
들어온 순서대로 데이터가 쌓이고, 마지막에 들어온 데이터부터 차례대로 나간다.</p>
</li>
</ul>
<hr>
<h3 id="3-스택의-장점과-단점">##3. 스택의 장점과 단점</h3>
<h4 id="31-장점">###3.1 장점</h4>
<p>데이터의 삽입과 삭제가 맨 위에서만 이루어지므로 구현이 간단하고, 데이터를 관리하기 쉽다.</p>
<h4 id="32-단점">###3.2 단점</h4>
<p>스택의 크기가 정해져 있으면, 
그 크기를 <strong>초과하는 데이터를 삽입하려하면</strong> 스택 <strong>오버플로우(Overflow)</strong>가 발생할 수 있다. 
반면, 스택이 <strong>비어있는 상태</strong>에서 데이터를 꺼내려고 하면 스택 <strong>언더플로우(Underflow)</strong>가 발생합니다.</p>
<blockquote>
<p><strong>오버플로우(Overflow)</strong> : 스택이 완전히 꽉 찬 상태
<strong>언더플로우(Underflow)</strong> : 스택이 완전히 비어 있는 상태</p>
</blockquote>
<hr>
<h3 id="4-스택의-추상자료형">##4. 스택의 추상자료형</h3>
<h4 id="41-toppeek-스택-포인터">###4.1 Top/Peek (스택 포인터)</h4>
<p>스택의 맨 위의 데이터를 <strong>조회</strong>하는 연산이다.</p>
<h4 id="42-isempty">###4.2 isEmpty</h4>
<p>스택이 <strong>비어있는지 확인</strong>하는 연산이다.</p>
<h4 id="43-isfull">###4.3 isFull</h4>
<p>스택이 <strong>가득 차 있는지 확인</strong>하는 연산이다.</p>
<h4 id="44-getsize">###4.4 getSize</h4>
<p>스택에 있는 <strong>요소 수</strong>를 반환하는 연산이다.</p>
<h4 id="45-push">###4.5 Push</h4>
<p>스택의 <strong>맨 위에 데이터를 추가</strong>하는 연산이다.
<img src="https://velog.velcdn.com/images/kor-seonwoo/post/a79b3722-6084-4284-b782-ffb9a91acf94/image.png" style="width: 100%; max-width: 500px;" /><a href="https://yoongrammer.tistory.com/m/45">이미지 출처</a></p>
<blockquote>
<p><strong>push의 단계</strong>를 간단하게 설명하자면, 아래와 같이 정리할 수 있다.
① : <strong>isFull</strong>을 통해 <strong>스택에 데이터가 가득찼는지 확인 후</strong> 가득 차지 않았다면
② : <strong>Top(스택 포인터)을 다음 위치로 이동</strong>시킨다.
③ : <strong>이동한 Top(스택 포인터) 위치에 데이터를 저장</strong>한다.</p>
</blockquote>
<h4 id="46-pop">###4.6 Pop</h4>
<p>스택의 <strong>맨 위에서 데이터를 제거</strong>하고, 그 <strong>데이터를 반환</strong>하는 연산이다.
<img src="https://velog.velcdn.com/images/kor-seonwoo/post/440fb42d-b76d-43bd-b3b6-d35a6c5d77d3/image.png" style="width: 100%; max-width: 500px;" /> <a href="https://yoongrammer.tistory.com/m/45">이미지 출처</a></p>
<blockquote>
<p><strong>Pop의 단계</strong>를 간단하게 설명하자면, 아래와 같이 정리할 수 있다.
① : <strong>isEmpty</strong>을 통해 <strong>스택에 데이터가 존재하는지 확인 후</strong> 존재 한다면
② : <strong>Top(스택 포인터)이 가리키는 데이터</strong>를 반환한다.
③ : <strong>Top(스택 포인터)을 이전 위치로 이동</strong>한다.</p>
</blockquote>
<hr>
<h3 id="5-스택의-시간복잡도">##5. 스택의 시간복잡도</h3>
<p>스택의 주요 연산인 Push(삽입)과 Pop(삭제) 모두 데이터의 개수에 상관없이 맨 위에서 연산이 이루어지므로 <code>O(1)의 시간복잡도</code>를 가진다.</p>
<hr>
<h3 id="6-스택의-사용">##6. 스택의 사용</h3>
<h4 id="61-프로그램-실행-시-메모리-구조">###6.1 프로그램 실행 시 메모리 구조</h4>
<p>컴퓨터에서 프로그램을 실행할 때, 메모리에서 스택 영역은 함수의 호출과 관련된 지역 변수, 매개 변수, 반환 값 등을 저장하는 데 사용된다. 이는 함수의 실행을 관리하는 데 필수적인 역할을 한다.</p>
<h4 id="62-컴퓨터의-히스토리-관리">###6.2 컴퓨터의 히스토리 관리</h4>
<p>웹 브라우저에서 뒤로 가기 기능을 구현할 때 스택이 사용된다. 
방문한 웹 페이지의 URL을 스택에 푸시하고, 사용자가 뒤로 가기를 누르면 팝하여 이전 페이지로 이동한다.</p>
<h4 id="63-문자열-역순-출력">###6.3 문자열 역순 출력</h4>
<p>문자열을 역순으로 출력하는 데 스택을 사용할 수 있다. 
문자열의 각 문자를 스택에 푸시하고, 팝하여 문자열을 역순으로 만들 수 있다.</p>
<h4 id="64-괄호-검사">###6.4 괄호 검사</h4>
<p>프로그래밍에서 괄호가 올바르게 닫혀 있는지 검사하는 데 스택을 사용할 수 있다. 
여는 괄호를 만나면 스택에 푸시하고, 닫는 괄호를 만나면 스택에서 팝하여 괄호를 검사한다.</p>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://yoongrammer.tistory.com/m/45">https://yoongrammer.tistory.com/m/45</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[REST API , GraphQL]]></title>
            <link>https://velog.io/@kor-seonwoo/REST-API-GraphQL</link>
            <guid>https://velog.io/@kor-seonwoo/REST-API-GraphQL</guid>
            <pubDate>Thu, 02 Nov 2023 03:55:40 GMT</pubDate>
            <description><![CDATA[<h2 id="rest-api-graphql">REST API, GraphQL</h2>
<h3 id="1-api-application-programming-interface">1. API (Application Programming Interface)</h3>
<p><img src="https://velog.velcdn.com/images/kor-seonwoo/post/97bd18c7-b639-4b48-bf0d-1484507cdf28/image.png" alt=""> API는 컴퓨터나 컴퓨터 프로그램 사이의 연결이다. 즉, 프로그램들이 서로 소통하는 방법이다.
구글 맵 API, 카카오 비전 API 등 기존에 있는 응용 프로그램을 통해서 데이터를 제공받거나 기능을 사용하고자 할 때 사용하는 인터페이스 및 규격 을 말한다.</p>
<hr>
<h3 id="2-rest-api">2. REST API</h3>
<h4 id="21-rest란"><strong>2.1 REST란?</strong></h4>
<p>&quot;REpresentational State Transfer&quot; 의 약자로, 
<strong>자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것</strong>.
HTTP <strong>*URI를 통해 자원을 명시</strong>하고 <strong>HTTP 메서드(GET, POST, PUT, DELETE)를 통해</strong> 해당 자원에 대한 <strong>*CRUD를 적용</strong>하는 것을 말한다.</p>
<blockquote>
<p><strong>*자원</strong> : 문서, 그림, DB, 이미지, 동영상, 해당 소프트웨어 자체 등 모든 자료를 의미한다.
<strong>*URI</strong> : 인터넷 상의 자원을 식별하기 위한 문자열의 구성이다.
<strong>*CRUD</strong> : Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다.</p>
</blockquote>
<h4 id="22-rest-api란"><strong>2.2 REST API란?</strong></h4>
<p><strong>REST 원칙을 적용하여 서비스 API를 설계한 것을 말한다.</strong>
각 요청이 어떤 동작이나 정보를 위한 것인지를 그 요청의 <strong>모습 자체로 추론이 가능하다는 것이 REST API의 특징</strong>이다.</p>
<h4 id="23-rest-api의-설계-규칙"><strong>2.3 REST API의 설계 규칙</strong></h4>
<ol>
<li><p><code>자원에는 형용사, 동사가 아닌 명사를 사용한다.</code></p>
<pre><code>❌ https://velog.io/@kor-seonwoo/duplicating</code></pre><pre><code>⭕ https://velog.io/@kor-seonwoo/duplicate</code></pre></li>
<li><p><code>슬래시(/)로 계층 관계를 표현하고 마지막에 슬래시를 포함하지 않는다.</code></p>
<pre><code>❌ https://velog.io/@kor-seonwoo/notice/</code></pre><pre><code>⭕ https://velog.io/@kor-seonwoo/notice</code></pre></li>
<li><p><code>언더바(_) 대신 하이픈(-)을 사용한다.</code></p>
<pre><code>❌ https://velog.io/@kor-seonwoo/notice/first_notice</code></pre><pre><code>⭕ https://velog.io/@kor-seonwoo/notice/first-notice </code></pre></li>
<li><p><code>URI는 소문자로만 구성한다.</code></p>
<pre><code>❌ https://velog.io/@kor-seonwoo/notice/firstNotice</code></pre><pre><code>⭕ https://velog.io/@kor-seonwoo/notice/firstnotice </code></pre></li>
<li><p><code>행위를 포함하지 않는다.</code></p>
<pre><code>❌ POST https://velog.io/@kor-seonwoo/notice/post/1</code></pre><pre><code>⭕ DELETE https://velog.io/@kor-seonwoo/notice/1 </code></pre></li>
<li><p><code>파일 확장자는 URI에 포함하지 않는다.</code></p>
<pre><code>❌ https://velog.io/@kor-seonwoo/notice/photo.jpg</code></pre><pre><code>⭕ https://velog.io/@kor-seonwoo/notice/photo</code></pre></li>
<li><p><code>HTTP 응답 상태 코드 사용</code>
클라이언트는 해당 요청에 대한 실패, 처리완료 또는 잘못된 요청 등에 대한 피드백을 받아야 한다.</p>
</li>
</ol>
<h4 id="24-restful-api란"><strong>2.4 RESTful API란?</strong></h4>
<p><strong>RESTful</strong>은 <code><strong>REST의 설계 규칙을 잘 지켜서 설계된 API</strong></code>를 의미한다.
<code><strong>즉, REST의 원리를 잘 따르는 시스템을 RESTful이란 용어로 지칭</strong></code>한다.</p>
<hr>
<h3 id="3-graphql">3. GraphQL</h3>
<h4 id="31-graphql이란"><strong>3.1 GraphQL이란?</strong></h4>
<p>GraphQL은 클라이언트와 서버 간의 데이터 통신을 위한 쿼리 언어이다. 클라이언트가 필요한 데이터를 요청할 때 <strong>원하는 구조로 한 번에 받을 수 있도록</strong> 설계된 쿼리 언어이다.</p>
<h4 id="32-graphql의-특징"><strong>3.2 GraphQL의 특징</strong></h4>
<ul>
<li><strong>유연한 데이터 요청</strong>
필요한 데이터를 GraphQL 쿼리 문법을 사용하여 직접 지정할 수 있고, 여러 데이터를 한 번의 요청으로 받을 수 있다.</li>
<li><strong>타입 시스템</strong>
서버가 제공하는 데이터의 타입과 구조를 사전에 정의할 수 있다.</li>
<li><strong>문서화 및 디버깅</strong>
자체적인 문서화 기능을 제공하며, 오류 메시지를 통해 디버깅을 용이하게 한다.</li>
</ul>
<h4 id="33-graphql-쿼리-예시"><strong>3.3 GraphQL 쿼리 예시</strong></h4>
<pre><code>{
  alluser {
    name
    email
  }
}</code></pre><pre><code>{
  user(id: 1) {
    name
    email
    posts {
      title
      content
    }
  }
}</code></pre><h4 id="34-graphql-서버와의-통신"><strong>3.4 GraphQL 서버와의 통신</strong></h4>
<p>클라이언트는 GraphQL 쿼리를 서버로 전송하고, 서버는 해당 쿼리를 해석하여 필요한 데이터를 응답한다.</p>
<h4 id="35-graphql을-쓰는-이유"><strong>3.5 GraphQL을 쓰는 이유</strong></h4>
<ul>
<li><strong>타입 안정성 보장</strong>
타입 시스템을 통해 데이터의 구조와 타입을 명확하게 정의할 수 있으므로, 데이터의 안정성을 보장합니다.</li>
<li><span style="color: red"><strong>Overfetching</span> 및 <span style="color: blue">Underfetching</span> 해결로 인한 데이터 효율 향상</strong>
클라이언트가 필요한 데이터만을 요청하고 응답받기 때문에, 네트워크 효율이 향상된다.</li>
</ul>
<blockquote>
<p><span style="color: red"><strong>Overfetching</strong></span>
내가 필요로 하는 데이터보다 더 <strong>많은</strong> 데이터를 fetch하는 것.</p>
<ul>
<li>일반적인 REST API의 경우 내가 필요로 하는 데이터를 콕콕 찝어 요청하는게 아닌 data 전부를 받아야한다.</li>
<li>하지만 GraphQL을 사용하면 내가 필요로 하는 데이터를 콕콕 찝어 요청할 수 있고 응답 또한 내가 원하는 data만을 받을 수 있다. 이러한 특성으로 Overfetching 문제를 해결할 수 있다.</li>
</ul>
</blockquote>
<blockquote>
<p><span style="color: blue"><strong>Underfetching</strong></span>
내가 필요로 하는 데이터보다 <strong>적게</strong> 데이터를 fetch하는 것.</p>
<ul>
<li>한번의 reqeust로는 내가 필요로 하는 데이터를 얻지 못하고 여러번의 reqeust로 원하는 data를 얻는 것.</li>
<li>이것 또한 graphQL을 사용하면 단일 reqeust만으로도 내가 원하는 데이터를 콕콕 찝어 응답 받을 수 있다.</li>
</ul>
</blockquote>
<hr>
<h3 id="4-rest-api와-graphql의-차이점">4. REST API와 GraphQL의 차이점</h3>
<p><strong>데이터 요청과 응답</strong>: 
<strong>REST API</strong>는 <code>서버가 데이터 구조를 결정하고, 클라이언트는 서버가 제공하는 데이터를 받는다.</code> 
반면, <strong>GraphQL</strong>은 <code>클라이언트가 필요한 데이터의 구조를 결정하고, 서버는 요청한 데이터를 그대로 응답한다.</code> </p>
<p><strong>요청의 수</strong>: 
<strong>REST API</strong>는 <code>각 리소스에 대한 별도의 엔드포인트가 필요하므로, 여러 데이터를 받기 위해서는 여러 번의 요청이 필요하다.</code><br>반면, <strong>GraphQL</strong>은 <code>한 번의 요청으로 여러 데이터를 받을 수 있다.</code> </p>
<p><strong>버전 관리</strong>: 
<strong>REST API</strong>는 <code>데이터 구조의 변경이 필요할 때 새로운 버전의 API를 만들어야 한다.</code> 
반면, <strong>GraphQL</strong>은 <code>클라이언트가 데이터의 구조를 결정하므로, 서버의 데이터 구조가 변경되어도 클라이언트에 영향을 미치지 않는다. 따라서 별도의 버전 관리가 필요하지 않다.</code> </p>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://www.youtube.com/watch?v=iyFHfzCRHA8">https://www.youtube.com/watch?v=iyFHfzCRHA8</a></li>
<li><a href="https://velog.io/@couchcoding/%EA%B0%9C%EB%B0%9C-%EC%B4%88%EB%B3%B4%EB%A5%BC-%EC%9C%84%ED%95%9C-RESTful-API-%EC%84%A4%EA%B3%84-%EA%B0%80%EC%9D%B4%EB%93%9C">https://velog.io/@couchcoding/%EA%B0%9C%EB%B0%9C-%EC%B4%88%EB%B3%B4%EB%A5%BC-%EC%9C%84%ED%95%9C-RESTful-API-%EC%84%A4%EA%B3%84-%EA%B0%80%EC%9D%B4%EB%93%9C</a></li>
<li><a href="https://dev-coco.tistory.com/97">https://dev-coco.tistory.com/97</a></li>
<li><a href="https://cocoon1787.tistory.com/540">https://cocoon1787.tistory.com/540</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS - 자료구조] 순차 리스트(배열)]]></title>
            <link>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%88%9C%EC%B0%A8-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%B0%B0%EC%97%B4</link>
            <guid>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%88%9C%EC%B0%A8-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%B0%B0%EC%97%B4</guid>
            <pubDate>Wed, 01 Nov 2023 04:01:07 GMT</pubDate>
            <description><![CDATA[<h2 id="-배열">#. 배열</h2>
<hr>
<h3 id="1-배열이란">##1. 배열이란?</h3>
<p>배열은 <strong>같은 타입의 데이터를 연속적으로 저장할 수 있는 선형 자료구조</strong>이다.
저장된 데이터는 <strong>인덱스(index)</strong>와 <strong>원소값(elemtent)</strong>의 쌍으로 구성되고, <strong>인덱스(index)를 통해 각 데이터에 접근 할 수 있다</strong>. 인덱스는 배열의 시작부터 몇 번째 위치에 데이터가 있는지를 나타내고, 배열의 크기는 생성시에 정해지며, 이후에는 변경할 수 없다.</p>
<hr>
<h3 id="2-배열의-장점과-단점">##2. 배열의 장점과 단점</h3>
<h4 id="21-장점">###2.1 장점</h4>
<ul>
<li>인덱스를 통한 데이터 접근이 가능해 요소에 빠르게 접근할 수 있다.</li>
<li>간단하게 구현하고 사용하기 쉽다.<h4 id="22-단점">###2.2 단점</h4>
</li>
<li>한 번 크기를 정하면 변경할 수 없다. 이로 인해 데이터의 추가, 삭제가 어렵고 배열의 크기를 변경하려면 새로운 배열을 생성하고 데이터를 복사해야 한다.</li>
<li>배열의 크기를 미리 크게 잡아놓고 일부만 사용하는 경우, 사용하지 않는 메모리 공간이 낭비될 수 있다.</li>
</ul>
<hr>
<h3 id="3-배열의-시간복잡도">##3. 배열의 시간복잡도</h3>
<p>배열 내 연산은 크게 4가지로 나뉜다.</p>
<h4 id="31-접근">###3.1 접근</h4>
<p><strong>배열의 특정 인덱스에 접근하는 경우</strong>, 배열은 인덱스를 통해 데이터에 직접 접근할 수 있기 때문에 <code><strong>O(1)의 시간 복잡도</strong></code>를 가진다. </p>
<h4 id="32-검색">###3.2 검색</h4>
<p><strong>배열에서 특정 데이터를 찾는 경우</strong>, 배열은 순차검색이기 때문에 최악의 경우 배열의 모든 요소를 확인해야 하므로 <code><strong>O(n)의 시간 복잡도</strong></code>를 가진다.</p>
<h4 id="33-추가">###3.3 추가</h4>
<p><strong>배열의 끝에 데이터를 추가하는 경우</strong>, 일반적으로 <code><strong>O(1)의 시간 복잡도</strong></code>를 가진다. 
하지만 <strong>배열이 가득 차 있어 크기를 변경해야 하는 경우</strong>, 새 배열을 생성하고 기존 데이터를 복사해야 하므로 이 경우에는 <code><strong>O(n)의 시간 복잡도</strong></code>를 가진다.</p>
<h4 id="34-삭제">###3.4 삭제</h4>
<p><strong>배열의 끝에서 데이터를 삭제하는 경우</strong>, <code><strong>O(1)의 시간 복잡도</strong></code>를 가진다. 
그러나 <strong>중간에 있는 데이터를 삭제하는 경우</strong>, 삭제한 위치 이후의 데이터를 앞으로 이동시켜야 하므로 이 경우에는 <code><strong>O(n)의 시간 복잡도</strong></code>를 가진다.</p>
<hr>
<h3 id="4-배열의-사용">##4. 배열의 사용</h3>
<h4 id="41-직접적인-인덱스-접근">###4.1 직접적인 인덱스 접근</h4>
<p>배열의 각 요소에 고유한 인덱스로 특정 위치의 데이터에 빠르게 접근 할 수 있다. 이는 특정 위치의 데이터를 읽거나 수정할 때 유용하다.</p>
<h4 id="42-메모리-효율성">###4.2 메모리 효율성</h4>
<p>메모리 공간을 연속적으로 사용하므로, 메모리 관리가 간단하고 효율적이다. 이로 인해 메모리 낭비를 최소화할 수 있다.</p>
<h4 id="43-데이터-관리-용이">###4.3 데이터 관리 용이</h4>
<p>동일한 타입의 여러 데이터를 하나의 이름으로 그룹화하여 관리할 수 있기 때문에, 데이터 관리가 용이하다. 이는 반복적인 작업을 수행할 때 특히 유용하다.</p>
<h4 id="44-다차원-데이터-처리">###4.4 다차원 데이터 처리</h4>
<p>2차원, 3차원 등 다차원 배열을 사용하면 복잡한 데이터 구조를 효과적으로 표현하고 처리할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS - 자료구조] 자료구조란?]]></title>
            <link>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EB%9E%80</link>
            <guid>https://velog.io/@kor-seonwoo/CS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EB%9E%80</guid>
            <pubDate>Tue, 31 Oct 2023 11:35:28 GMT</pubDate>
            <description><![CDATA[<h2 id="1-자료와-정보">1. 자료와 정보</h2>
<h3 id="11-자료">1.1 자료</h3>
<p>현실 세계에서 관찰이나 측정을 통해서 수집된 값(value)이나 사실(fact)로 이는 숫자, 문자, 이미지, 음성 등과 같은 다양한 형태로 존재할 수 있다.</p>
<h3 id="12-정보">1.2 정보</h3>
<p>어떤 상황에 대해서 적절한 의사결정(decision)을 할 수 있게 하는 지식(knowledge)으로 활용될 수 있도록 ‘처리 과정’을 거쳐서 정리되고 정돈된 ‘자료’의 2차 처리 결과물이다.</p>
<blockquote>
<p>자료(<span style="color: red;"><strong>D</strong></span>ata) → 컴퓨터 처리(<span style="color: red;"><strong>P</strong></span>rocess) → 정보(<span style="color: red;"><strong>I</strong></span>nformation) 
<code>I = P(D)</code></p>
</blockquote>
<p>즉, 프로세스에 자료를 대입하여 처리를 한 결과물이 정보이다.</p>
<h2 id="2-자료구조와-알고리즘">2. 자료구조와 알고리즘</h2>
<h3 id="21-자료구조">2.1 자료구조</h3>
<p>자료 사이의 논리적 관계를 컴퓨터나 프로그램에 적용하기 위해서는 *자료의 추상화가 필요하며 추상화를 통해 자료의 논리적 관계를 구조화한 것을 자료구조(data structure)라고 한다.</p>
<blockquote>
<p>추상화 : <strong>공통적인 개념</strong>을 이용하여 <strong>같은 종류의 다양한 객체를 정의</strong>한 것.
자료의 추상화 : <strong>다양한 대상을 컴퓨터에 저장하고 처리하기 위해 대상들의 공통 특징만을 뽑아 정의</strong>한 것.</p>
</blockquote>
<h3 id="22-자료구조의-종류">2.2 자료구조의 종류</h3>
<p><img src="https://velog.velcdn.com/images/kor-seonwoo/post/7091957c-7ba0-4f16-a142-9666e0d8acd9/image.png" alt=""></p>
<h3 id="23-알고리즘">2.3 알고리즘</h3>
<p>컴퓨터에 의해 수행되기 위해 필요한 <strong>명령어들의 유한 집합이 사람의 머릿속에 추상화되어 존재</strong>하는 것.
알고리즘이 가지고 있어야 하는 조건은 ① 출력, ② 유효성, ③ 입력, ④ 명확성, ⑤ 유한성 등이 있다.</p>
<h3 id="24-자료구조와-알고리즘의-관계">2.4 자료구조와 알고리즘의 관계</h3>
<p>자료구조 : <strong>입력 자료에 대한 추상화</strong>된 상태
알고리즘 : 컴퓨터가 수행해야 할 <strong>명령의 추상화</strong>
즉, <strong>자료구조로 구조화</strong>하고 <strong>알고리즘으로 체계화</strong>한다.
이러한 자료구조와 알고리즘을 <strong>구체화</strong>하는 수단 중 하나가 <strong>프로그래밍 언어</strong>이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 이벤트 버블링&캡처링]]></title>
            <link>https://velog.io/@kor-seonwoo/JavaScript-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EC%BA%A1%EC%B2%98%EB%A7%81</link>
            <guid>https://velog.io/@kor-seonwoo/JavaScript-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B2%84%EB%B8%94%EB%A7%81%EC%BA%A1%EC%B2%98%EB%A7%81</guid>
            <pubDate>Mon, 30 Oct 2023 07:19:13 GMT</pubDate>
            <description><![CDATA[<h2 id="버블링과-캡처링">버블링과 캡처링</h2>
<h3 id="이벤트-버블링">이벤트 버블링</h3>
<p>이벤트가 하위 요소에서 상위 요소로 전파
<img src="https://velog.velcdn.com/images/kor-seonwoo/post/87e12dfe-0344-4232-b9f9-16be8915723f/image.png" alt=""></p>
<p>버블링은 타깃 이벤트에서 시작해 <code>document</code> 객체를 만날 때까지 각 노드에서 모두 발생한다. 이러한 버블링은 <code>event.stopPropagation()</code>를 사용해 중단할 수 있다. 하지만 버블링은 유용하기 때문에 버블링을 꼭 멈춰야 하는 명백한 상황이 아니라면 버블링을 막지 않는게 좋다.</p>
<hr>
<h3 id="이벤트-캡처링">이벤트 캡처링</h3>
<p>이벤트가 상위 요소에서 하위 요소로 전파
<img src="https://velog.velcdn.com/images/kor-seonwoo/post/49215907-2b5d-4624-be22-d45637543c90/image.png" alt=""></p>
<pre><code class="language-javascript">elem.addEventListener(..., true)</code></pre>
<p><code>addEventListener</code>의 <code>capture</code> 옵션을 <code>true</code>로 설정하면 캡처링 단계에서 이벤트를 잡아낼 수 있다.
캡처링 단계는 거의 쓰이지 않고, 주로 버블링 단계의 이벤트만 다뤄진다.</p>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://ko.javascript.info/bubbling-and-capturing">https://ko.javascript.info/bubbling-and-capturing</a></li>
<li><a href="https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-4/event-bubbling.md#%ED%83%80%EA%B9%83-%EB%8B%A8%EA%B3%84">https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-4/event-bubbling.md#%ED%83%80%EA%B9%83-%EB%8B%A8%EA%B3%84</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 클로저(Closure)]]></title>
            <link>https://velog.io/@kor-seonwoo/JavaScript-%ED%81%B4%EB%A1%9C%EC%A0%80</link>
            <guid>https://velog.io/@kor-seonwoo/JavaScript-%ED%81%B4%EB%A1%9C%EC%A0%80</guid>
            <pubDate>Fri, 27 Oct 2023 07:39:21 GMT</pubDate>
            <description><![CDATA[<h2 id="클로저closure">클로저(Closure)</h2>
<p>자바스크립트에서 클로저(Closure)는 함수와 그 함수가 선언된 렉시컬 환경(Lexical Environment) 간의 조합을 나타낸다. 간단히 말하면, 클로저는 함수가 자신이 생성된 렉시컬 스코프를 기억하고 그 스코프에 접근할 수 있게 하는 메커니즘이다.</p>
<p>아래의 예시 코드를 통해 클로저의 메커니즘을 살펴보자.</p>
<pre><code class="language-javascript">function outer() {
  const message = &quot;Closure&quot;;

  function inner() {
    console.log(message);
  }

  return inner;
}

const myFunction = outer();
myFunction(); // 출력: &quot;Closure&quot;</code></pre>
<ol>
<li><p><code>const myFunction = outer();</code> 해당 코드가 실행 될 때, outer 함수의 렉시컬 스코프에 <code>message = "Closure"</code> 기억되게 되고 <code>return inner;</code> 코드에 따라 <code>myFunction</code> 이라는 변수는 <code>inner</code> 함수를 참조하게 된다.</p>
</li>
<li><p><code>이후 myFunction();</code>가 실행되면 참조된 <code>inner</code> 함수를 찾아 실행하게 되는데 <code>inner</code> 함수의 렉시컬 스코프에는 <code>message</code> 값이 존재하지 않으니 상위 스코프인 <code>outer</code> 함수의 렉시컬 스코프에 기억된 <code>message</code>를 찾아 값을 가져와 <code>console.log(message);</code>코드를 실행시키게 된다.</p>
</li>
</ol>
<p>이렇게 상위 렉시컬 스코프에 접근 할 수 있고, 그 스코프에 있는 변수에 접근할 수 있는 상황을 클로저라고 한다. 클로저를 활용하면 함수가 생성된 당시의 렉시컬 환경을 기억하고, 이를 통해 외부 변수에 접근 할 수 있다.</p>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-5/closure.md">https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-5/closure.md</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 호이스팅(hoisting)]]></title>
            <link>https://velog.io/@kor-seonwoo/JavaScript-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85</link>
            <guid>https://velog.io/@kor-seonwoo/JavaScript-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85</guid>
            <pubDate>Fri, 27 Oct 2023 05:15:38 GMT</pubDate>
            <description><![CDATA[<h2 id="호이스팅hoisting">호이스팅(hoisting)</h2>
<p>자바스크립트에서 호이스팅은 코드 실행 전 변수 및 함수 선언문이 스코프 내의 최상단으로 끌어올려지는 동작을 의미한다.</p>
<h3 id="1-변수-호이스팅">1. 변수 호이스팅</h3>
<h4 id="11-var">1.1. var</h4>
<pre><code class="language-javascript">console.log(myAge); // undefined
var myAge = 28;</code></pre>
<p>해당 코드는 우리가 알고 있는 동기 처리의 개념에서는 에러가 발생할 것 같지만 결과값은 <code>undefined</code>가 출력된다.</p>
<p>이는 컴파일러는 자바스크립트 엔진이 인터프리팅을 하기 전에 컴파일을 하는데 호이스팅으로 인해 실제로는 아래의 코드와 같이 동작을 한다.</p>
<pre><code class="language-javascript">var myAge;
console.log(myAge); // undefined
myAge = 28;</code></pre>
<h4 id="12-letconst">1.2 let,const</h4>
<pre><code class="language-javascript">console.log(myAge); // ReferenceError: Cannot access &#39;myAge&#39; before initialization
let myAge = 28;

console.log(myName); // ReferenceError: Cannot access &#39;myName&#39; before initialization
const myName = &quot;Lee&quot;;</code></pre>
<blockquote>
<p><code>var</code>는 선언, 초기화가 동시에 이루어지기 때문에 위의 코드처럼 동작하지만
<code>let</code>,<code>const</code>는 선언단계만 호이스팅 되기 때문에 Reference Error를 출력되게 된다.</p>
</blockquote>
<hr>
<h3 id="2-함수-호이스팅">2. 함수 호이스팅</h3>
<h4 id="21-함수-선언문">2.1 함수 선언문</h4>
<p>함수의 선언문은 전체가 호이스팅되어 선언된 위치와 관계없이 코드 실행 전에 메모리에 올려진다.</p>
<pre><code class="language-javascript">hoisting();
function hoisting() {
  console.log(&#39;hoisting&#39;);
}</code></pre>
<h4 id="22-함수-표현식">2.2 함수 표현식</h4>
<p>함수 표현식의 경우에는 호이스팅이 되지 않는다.</p>
<pre><code class="language-javascript">hoisting(); // TypeError: hoisting is not a function
const hoisting = function() {
  console.log(&#39;hoisting&#39;);
}</code></pre>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-5/hoisting.md">https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-5/hoisting.md</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[브라우저 렌더링]]></title>
            <link>https://velog.io/@kor-seonwoo/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EB%A0%8C%EB%8D%94%EB%A7%81</link>
            <guid>https://velog.io/@kor-seonwoo/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EB%A0%8C%EB%8D%94%EB%A7%81</guid>
            <pubDate>Thu, 26 Oct 2023 08:18:53 GMT</pubDate>
            <description><![CDATA[<h2 id="브라우저-렌더링">브라우저 렌더링</h2>
<h3 id="1-브라우저-렌더링-과정-렌더링-엔진의-동작-과정">1. 브라우저 렌더링 과정 (렌더링 엔진의 동작 과정)</h3>
<ol>
<li><p><strong>DOM Tree 생성 :</strong>
HTML를 파싱 후, <strong>DOM Tree 생성</strong>한다.</p>
</li>
<li><p><strong>CSSOM Tree 생성 :</strong>
CSS를 파싱 후, <strong>CSSOM Tree 생성</strong>한다.</p>
</li>
<li><p><strong>Javascript를 실행 :</strong> 
HTML 중간에 스크립트가 존재하면 DOM Tree를 변경될 수 있기에 HTML 파싱이 중단되는데 이는 defer(파싱이 완료된 후 실행), async(비동기 실행) 옵션을 통해 제어할 수 있다. </p>
</li>
<li><p><strong>DOM Tree와 CSSOM Tree를 조합하여 Render Tree 생성 :</strong>
이때, <code>display: none;</code> 속성과 같이 화면에서 보이지도 않고 공간을 차지하지 않는 것들은 Render Tree로 구축되지 않는다.</p>
</li>
<li><p><strong>Render Tree 배치 (Layout(Reflow)) :</strong>
뷰포트 기반으로 렌더트리의 각 노드가 가지는 정확한 위치와 크기를 계산한다.</p>
</li>
<li><p><strong>Render Tree 그리기 (paint(Repaint)) :</strong>
계산한 위치/크기를 기반으로 화면에 그린다.</p>
</li>
</ol>
<hr>
<h3 id="2-reflow-repaint">2. Reflow, Repaint</h3>
<h4 id="21-reflow">2.1 Reflow</h4>
<p>생성된 DOM 노드의 레이아웃 수치 변경 시 영향 받은 모든 노드의 수치를 다시 계산하여, <strong>Render Tree</strong>를 재생성하는 과정이다.</p>
<blockquote>
<ul>
<li>DOM 엘리먼트 추가, 제거 또는 변경</li>
</ul>
</blockquote>
<ul>
<li>CSS 스타일 추가, 제거 또는 변경</li>
<li>CSS 스타일을 직접 변경하거나, 클래스를 추가함으로써 레이아웃이 변경될 수 있습니다. 엘리먼트의 길이를 변경하면, DOM 트리에 있는 다른 노드에 영향을 줄 수 있습니다.</li>
<li>CSS3 애니메이션과 트랜지션. 애니메이션의 모든 프레임에서 리플로우가 발생합니다.</li>
<li>offsetWidth 와 offsetHeight 의 사용. offsetWidth 와 offsetHeight 속성을 읽으면, 초기 리플로우가 트리거되어 수치가 계산됩니다.</li>
<li>유저 행동. 유저 인터랙션으로 발생하는 hover 효과, 필드에 텍스트 입력, 창 크기 조정, 글꼴 크기 변경, 스타일시트 또는 글꼴 전환등을 활성화하여 리플로우를 트리거할 수 있습니다.<blockquote>
</blockquote>
출처: <a href="https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-5/reflow-repaint.md#gear-Reflow">Reflow와 Repaint가 실행되는 시점(Reflow)</a></li>
</ul>
<h4 id="22-repaint">2.2 Repaint</h4>
<p>Reflow 과정이 끝난 후 재생성된 렌더 트리를 다시 그리는 과정</p>
<blockquote>
<ul>
<li>가시성이 변경되는 순간 (opacity, background-color, visibility, outline)</li>
</ul>
</blockquote>
<ul>
<li>Reflow 가 실행된 순간 뒤에 실행됩니다.<blockquote>
</blockquote>
출처 : <a href="https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-5/reflow-repaint.md#gear-Repaint">Reflow와 Repaint가 실행되는 시점(Repaint)</a></li>
</ul>
<h4 id="23-reflow를-피하거나-영향을-최소화">2.3 Reflow를 피하거나 영향을 최소화</h4>
<p><a href="https://lists.w3.org/Archives/Public/public-html-ig-ko/2011Sep/att-0031/Reflow_____________________________Tip.pdf">링크의 3p 하단부터</a> 방법들이 설명되어있다.</p>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-5/browser-rendering.md">https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-5/browser-rendering.md</a></li>
<li><a href="https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-5/reflow-repaint.md">https://github.com/Esoolgnah/Frontend-Interview-Questions/blob/main/Notes/important-5/reflow-repaint.md</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] async/await]]></title>
            <link>https://velog.io/@kor-seonwoo/JavaScript-async%EC%99%80-await</link>
            <guid>https://velog.io/@kor-seonwoo/JavaScript-async%EC%99%80-await</guid>
            <pubDate>Wed, 25 Oct 2023 05:30:18 GMT</pubDate>
            <description><![CDATA[<h2 id="asyncawait">async/await</h2>
<p>async/await는 자바스크립트 비동기 처리 패턴 중 가장 최근에 나온 문법이다.(ES8)
콜백 함수와 프로미스의 단점을 보완하고 가독성이 좋은 코드를 작성할 수 있다.</p>
<h3 id="async">async</h3>
<p><code><strong>async</strong></code>는 function 앞에 위치한다.</p>
<pre><code class="language-javascript">async function f() {
    return 1;
}</code></pre>
<p>function 앞에 <code><strong>async</strong></code>를 붙이면 해당 함수는 항상 프로미스를 반환하고, 프로미스가 아닌 것은 프라미스로 감싸 반환한다.</p>
<h3 id="await">await</h3>
<p><code><strong>await</strong></code>는 <code><strong>async</strong></code> 함수 안에서만 동작한다.</p>
<pre><code class="language-javascript">let value = await promise;</code></pre>
<p>자바스크립트는 <strong>await</strong> 키워드를 만나게되면 프로미스가 처리될 때까지 기다린 후 결과를 반환한다. 프로미스가 처리되길 기다리는 동안엔 엔진이 다른 일(다른 스크립트를 실행, 이벤트 처리 등)을 할 수 있기 때문에, CPU 리소스가 낭비되지 않는다.</p>
<h3 id="asyncawait-장점">async/await 장점</h3>
<p>이전 포스팅에서 알아본거처럼 자바스크립트에서 비동기 처리를 한다면 아래와 같이 작성 할 수 있다.</p>
<pre><code class="language-javascript">function getData() {
    var tableData;
    $.get(&#39;https://domain.com/products/1&#39;, function(response) {
        tableData = response;
    });
    return tableData;
}

console.log(getData()); // undefined</code></pre>
<p>하지만 이 코드에서는 결과값이 <code>undefined</code>로 출력되는데 그 이유는 데이터를 요청하고 받아올 때 까지 기다려주지 않고 다음 코드를 실행해버리기 때문이다.</p>
<p>그래서 해당 문제점을 해결하기 위해 아래 코드와 같이 콜백 함수를 사용해왔다.</p>
<pre><code class="language-javascript">function getData(callbackFunc) {
    $.get(&#39;https://domain.com/products/1&#39;, function(response) {
        callbackFunc(response);
    });
}

getData(function(tableData) {
    console.log(tableData); // $.get()의 response 값이 tableData에 전달됨
});</code></pre>
<p>하지만 콜백 함수를 활용한 비동기 처리에도 단점이 있는데, 처리해야할 비동기 처리가 많아지면 콜백 지옥이 발생한다는 것이였다. 콜백 지옥은 코드 가독성과 유지보수에서 이점이 없기 때문에 <code>Promise</code>나 <code>async</code>를 사용해서 비동기 처리를 한다.</p>
<p>그 중 오늘 포스팅하는 <code>async/await</code>의 장점은 콜백 함수, 프로미스와 비교하며 느낄 수 있다.</p>
<p><strong>첫번째</strong>로는 콜백 함수를 사용하지 않고도 <code>await</code>을 활용하여 데이터를 기다렸다 받을 수 있다는 점이다.
<strong>두번째</strong>로는 프로미스에서 <code>response.json()</code>를 활용하면 JSON형식의 프로미스를 반환받게 되어 한번 더 <code>.then</code>을 사용하게되는데 <code>await response.json()</code>를 활용하면 데이터를 받을때까지 기다린 후 실행되기에 코드가 간결해지게 된다.</p>
<h3 id="asyncawait-기본-문법">async/await 기본 문법</h3>
<pre><code class="language-javascript">async function 함수명() {
  await 비동기_처리_메서드_명();
}</code></pre>
<p>함수 앞에 <code><strong>async</strong></code>라는 예약어를 붙이고, 함수 내부의 로직 중 비동기 처리 코드 앞에 <code><strong>await</strong></code>를 붙인다.</p>
<h3 id="asyncawait-에러-핸들링">async/await 에러 핸들링</h3>
<pre><code class="language-javascript">async function f() {

  try {
    let response = await fetch(&#39;http://유효하지-않은-주소&#39;);
    let user = await response.json();
  } catch(err) {
    // fetch와 response.json에서 발행한 에러 모두를 여기서 잡습니다.
    alert(err);
  }
}

f();</code></pre>
<p><code><strong>async/await</strong></code>는 <code><a href="https://ko.javascript.info/try-catch">try..catch</a></code>를 활용하여 에러 핸들링을 한다.</p>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://ko.javascript.info/async-await">https://ko.javascript.info/async-await</a></li>
<li><a href="https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/">https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/</a></li>
<li><a href="https://joshua1988.github.io/web-development/javascript/js-async-await/">https://joshua1988.github.io/web-development/javascript/js-async-await/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] fetch]]></title>
            <link>https://velog.io/@kor-seonwoo/JavaScript-fetch</link>
            <guid>https://velog.io/@kor-seonwoo/JavaScript-fetch</guid>
            <pubDate>Tue, 24 Oct 2023 08:47:03 GMT</pubDate>
            <description><![CDATA[<h2 id="fetch">fetch</h2>
<p>fetch 함수는 HTTP 요청 전송 기능을 제공하는 Web API의 한 종류이다.
반환하는 데이터는 <strong>HTTP response 객체를 래핑한 Promise 객체를 반환</strong>하기에 Promise의 후속처리함수(<code>then</code>,<code>catch</code>)를 사용할 수 있다.</p>
<ul>
<li><strong>예제 code</strong><pre><code class="language-javascript">// 1번 코드
fetch(&quot;https://jsonplaceholder.typicode.com/todos&quot;)
  .then(function(response){
      console.log(response);
  });
</code></pre>
</li>
</ul>
<p>// 2번 코드
fetch(&quot;<a href="https://jsonplaceholder.typicode.com/todos&quot;">https://jsonplaceholder.typicode.com/todos&quot;</a>)
    .then(function(response){
          console.log(response.json());
    })</p>
<p>// 3번 코드
fetch(&quot;<a href="https://jsonplaceholder.typicode.com/todos&quot;">https://jsonplaceholder.typicode.com/todos&quot;</a>)
    .then(function(response){
          return response.json();
    })
    .catch(function(reason) {
        console.log(reason);
    })
    .then(function(data) {
        console.log(data);
    });</p>
<pre><code>1번 코드 실행 시 아래와 같은 &lt;code&gt;HTTP response&lt;/code&gt; 객체를 래핑한 &lt;code&gt;Promise&lt;/code&gt;객체가 반환되는 것을 볼 수 있다.
- **response**
![](https://velog.velcdn.com/images/kor-seonwoo/post/f8b4034a-8b1d-48a6-8a42-b90672014d58/image.png)

대부분의 &lt;code&gt;REST API&lt;/code&gt;들이 &lt;code&gt;JSON&lt;/code&gt; 형태의 데이터 타입을 응답하기에 프로퍼티를 자세히보면 &lt;code&gt;JSON&lt;/code&gt;메서드가 존재한다. &lt;code&gt;JSON&lt;/code&gt;메서드 사용하여 2번 코드처럼 작성해준다면 &lt;code&gt;JSON&lt;/code&gt; 형식으로 바꾼 프로미스를 반환받는다. 이때 프로미스로 반환되는 이유는 아직 데이터를 다 받지 않은 상태여서 그렇다 그래서 프로미스 체이닝을 활용해 3번 코드처럼 작업하게 된다.

요약하자면
- &lt;code&gt;fetch&lt;/code&gt;함수를 활용하여 요청한 데이터를 **HTTP response 객체를 래핑한 Promise 객체 형태**로 받게된다.
- &lt;code&gt;response&lt;/code&gt;받은 객체의 프로퍼티 중에는 &lt;code&gt;JSON&lt;/code&gt;메서드가 존재하고 &lt;code&gt;JSON&lt;/code&gt;메서드를 활용하여 &lt;code&gt;JSON&lt;/code&gt;형식으로 변환한 프로미스를 받는다.
- &lt;code&gt;JSON&lt;/code&gt;형식의 프로미스를 체이닝을 활용하여 자바스크립트 객체로 변환받는다.
***

### fetch 사용법
```javascript
fetch(url, options)
  .then((response) =&gt; console.log(&quot;response:&quot;, response))
  .catch((error) =&gt; console.log(&quot;error:&quot;, error));</code></pre><p><code>fetch</code> 함수는 첫 번째 인자로 URL, 두 번째 인자로 옵션 객체를 전달받아 <strong>Promise 객체를 반환</strong>한다.
호출에 성공하였을 경우 response객체를 <code>resolve</code>, 실패했을 경우 error객체를 <code>reject</code>한다.</p>
<p>두번째 인자인 옵션(options)객체에는 <code>HTTP method</code>, <code>headers</code>, <code>body</code> 등을 설정해줄 수 있다.</p>
<h3 id="get-호출-조회">GET 호출 (조회)</h3>
<pre><code class="language-javascript">fetch(url)
  .then((response) =&gt; response.json())
  .then((data) =&gt; console.log(data))
  .catch((error) =&gt; console.log(&quot;error:&quot;, error));</code></pre>
<p><code>fetch</code> 함수는 디폴트로 <code><strong>GET</strong></code> 방식으로 작동하고 <code><strong>GET</strong></code>방식은 요청 전문을 받지 않기 때문에 옵션 인자(options)가 필요없다.
단순하게 보여주기 위한 데이터를 요청은 <code><strong>GET</strong></code>방식이 적절하다.</p>
<hr>
<h3 id="post-호출-생성">POST 호출 (생성)</h3>
<pre><code class="language-javascript">fetch(url, {
    method: &quot;POST&quot;,
      headers: {
        &quot;Content-Type&quot;: &quot;application/json&quot;,
      },
      body: JSON.stringify({
        title: &quot;Test&quot;,
        body: &quot;I am testing!&quot;,
        userId: 1,
      }),
})
  .then((response) =&gt; response.json())
  .then((data) =&gt; console.log(data))
  .catch((error) =&gt; console.log(&quot;error:&quot;, error));</code></pre>
<p><code><strong>POST</strong></code> 방식은 새로운 데이터를 추가하기 위해 사용된다. </p>
<hr>
<h3 id="put-호출-수정">PUT 호출 (수정)</h3>
<pre><code class="language-javascript">fetch(url/1, {
    method: &quot;PUT&quot;,
      headers: {
        &quot;Content-Type&quot;: &quot;application/json&quot;,
      },
      body: JSON.stringify({
        title: &quot;Test&quot;,
        body: &quot;I am testing!&quot;,
        userId: 1,
      }),
})
  .then((response) =&gt; response.json())
  .then((data) =&gt; console.log(data))
  .catch((error) =&gt; console.log(&quot;error:&quot;, error));</code></pre>
<p><code><strong>PUT</strong></code> 방식은 method 옵션만 <code><strong>PUT</strong></code>으로 설정한다는 점 빼놓고는 <code><strong>POST</strong></code> 방식과 비슷하다.
데이터의 수정하는데 주로 사용한다.</p>
<hr>
<h3 id="delete-호출-삭제">DELETE 호출 (삭제)</h3>
<pre><code class="language-javascript">fetch(url/1, {
    method: &quot;DELETE&quot;,
})
  .then((response) =&gt; response.json())
  .then((data) =&gt; console.log(data))
  .catch((error) =&gt; console.log(&quot;error:&quot;, error));</code></pre>
<p><code><strong>DELETE</strong></code> 방식에서는 보낼 데이터가 없기 때문에, <code>headers</code>와 <code>body</code> 옵션이 필요가 없다.
url 경로 매개변수를 지정하여 삭제하고싶은 데이터를 지정하여주면된다.</p>
<hr>
<p>위에서 알아본 HTTP method를 완벽하고 올바른 예시는 아닐 수 있겠지만 간단한 예시로 요약해보자면 
/- <strong>자체 서버의 유저정보 데이터를 활용한다고 예시를 들어보자.</strong></p>
<ul>
<li><code><strong>GET</strong></code> : 회원가입 과정에서 사용자가 입력한 데이터가 서버에 이미 존재하는지 유무를 확인하거나 로그인한 유저가 자신의 프로필 페이지를 보려할 때 등에서 사용한다.</li>
<li><code><strong>POST</strong></code> : 회원가입 과정에서 사용자가 입력한 데이터를 서버의 유저정보 데이터에 새롭게 추가 한다.</li>
<li><code><strong>PUT</strong></code> : 개인정보수정 페이지에서 사용자가 수정한 데이터를 서버의 유저정보 데이터에서 기존 데이터를 찾아 수정한다.</li>
<li><code><strong>DELET</strong></code> : 사용자가 회원탈퇴 버튼을 눌렀을 때 서버의 유저정보 데이터에서 요청한 사용자의 데이터를 삭제한다.</li>
</ul>
<p>더 좋고 더 많은 예제가 있을 수 있겠지만 간단하게 이렇게 예시를 들어볼 수 있을 것 같다.</p>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://velog.io/@eunjin/JavaScript-fetch-%ED%95%A8%EC%88%98-%EC%93%B0%EB%8A%94-%EB%B2%95-fetch-%ED%95%A8%EC%88%98%EB%A1%9C-HTTP-%EC%9A%94%EC%B2%AD%ED%95%98%EB%8A%94-%EB%B2%95">https://velog.io/@eunjin/JavaScript-fetch-%ED%95%A8%EC%88%98-%EC%93%B0%EB%8A%94-%EB%B2%95-fetch-%ED%95%A8%EC%88%98%EB%A1%9C-HTTP-%EC%9A%94%EC%B2%AD%ED%95%98%EB%8A%94-%EB%B2%95</a></li>
<li><a href="https://www.daleseo.com/js-window-fetch/">https://www.daleseo.com/js-window-fetch/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] Promise]]></title>
            <link>https://velog.io/@kor-seonwoo/JavaScript-Promise</link>
            <guid>https://velog.io/@kor-seonwoo/JavaScript-Promise</guid>
            <pubDate>Mon, 23 Oct 2023 10:30:28 GMT</pubDate>
            <description><![CDATA[<h2 id="promise">Promise</h2>
<p>Promise는 ES6에서 도입된 비동기 작업을 조금 더 수월하게 처리 할 수 있게 해주는 기능이다.</p>
<p>이전에는 비동기 작업을 처리 할 때 콜백 함수로 처리를 했었는데 처리할 비동기 작업이 많아지면 <a href="https://velog.io/@kor-seonwoo/JavaScript-ajax-setTimeout-%EC%BD%9C%EB%B0%B1-%ED%95%A8%EC%88%98">[JavaScript] ajax, setTimeout &amp; 콜백 함수</a> 편에서 알아본 콜백 지옥이 만들어져 코드의 유지보수성 및 가독성을 해치는 일이 발생한다. 이를 방지하기 위해 <strong>Promise</strong>를 학습해보도록 하자.</p>
<hr>
<h3 id="00-프로미스-처리-흐름">00. 프로미스 처리 흐름</h3>
<p><img src="https://velog.velcdn.com/images/kor-seonwoo/post/79c0a4fb-5e14-48c2-82f6-ecd0611a6b86/image.png" alt=""> 출처 : <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise</a></p>
<hr>
<h3 id="01-프로미스-생성">01. 프로미스 생성</h3>
<h4 id="executor">executor</h4>
<pre><code class="language-javascript">let promise = new Promise(function(resolve, reject) {
  // executor()
});</code></pre>
<p>executor는 프로미스가 만들어질 때 자동으로 전달되어 실행되는데 여기서 원하는 일이 처리가 된다. 처리가 끝나면 executor의 인수 <code><strong>resolve</strong></code>와 <code><strong>reject</strong></code>중 상황에 맞는 콜백을 선택하여 호출해야한다.</p>
<ul>
<li><strong>resolve(value)</strong> — 일이 성공적으로 끝난 경우 그 결과를 나타내는 value와 함께 호출</li>
<li><strong>reject(error)</strong> — 에러 발생 시 에러 객체를 나타내는 error와 함께 호출</li>
</ul>
<h4 id="states">states</h4>
<p>프로미스를 생성하고 종료될 때까지 3가지의 상태를 갖는다.</p>
<ul>
<li><strong>Pending(대기)</strong> : 비동기 처리 로직이 아직 완료되지 않은 상태</li>
<li><strong>Fulfilled(완료)</strong> : 비동기 처리가 완료되어 프로미스가 결과 값을 반환해준 상태</li>
<li><strong>Rejected(실패)</strong> : 비동기 처리가 실패하거나 오류가 발생한 상태</li>
</ul>
<blockquote>
<h4 id="pending대기">Pending(대기)</h4>
</blockquote>
<pre><code class="language-javascript">new Promise();</code></pre>
<p>프로미스를 호출하면 대기 상태가 된다.</p>
<h4 id="fulfilled완료">Fulfilled(완료)</h4>
<pre><code class="language-javascript">new Promise(function(resolve, reject) {
  resolve();
});</code></pre>
<p><code><strong>resolve</strong></code>를 즉시 호출해보면 프로미스는 Fulfilled(완료)상태가 된다.</p>
<h4 id="rejected실패">Rejected(실패)</h4>
<pre><code class="language-javascript">new Promise(function(resolve, reject) {
  reject();
});</code></pre>
<p><code><strong>reject</strong></code>를 즉시 호출해보면 프로미스는 Rejected(실패)상태가 된다.</p>
<hr>
<h3 id="02-프로미스-사용">02. 프로미스 사용</h3>
<p>프로미스 객체의 <strong>state</strong>와 <strong>result</strong> 프로퍼티는 내부 프로퍼티로 직접 접근할 수는 없고,
후속처리함수인 <code><strong>.then</strong></code>, <code><strong>.catch</strong></code> 메서드를 사용해 접근할 수 있다.</p>
<h4 id="then">.then</h4>
<pre><code class="language-javascript">promise.then(
  result =&gt; alert(result), // resolve일 때 실행
  error =&gt; alert(error) // reject일 때 실행
);</code></pre>
<p><code>.then</code>의 첫번째 인수는 프라미스가 이행되었을 때 실행되는 함수이고, 여기서 실행 결과를 받는다.
<code>.then</code>의 두번째 인수는 프라미스가 거부되었을 때 실행되는 함수이고, 여기서 에러를 받는다.</p>
<blockquote>
<p>✔ 두번째 인수는 생략하여 이행된 경우만을 다룰 수 있다.
✔ 첫번째 인수에 <code>null</code>을 전달하여 <code>.then(null, f)</code> 형태로 실패된 경우만을 다룰 수 있다.</p>
</blockquote>
<h4 id="catch">.catch</h4>
<pre><code class="language-javascript">// .catch(f)는 promise.then(null, f)과 동일하게 작동합니다
promise.catch(f); // Error 출력</code></pre>
<p>실패한 이유(실패 처리의 결과 값)를 <code>catch()</code>로 받을 수 있습니다.</p>
<blockquote>
<p>✔ .then 설명에서 알아본거 처럼 <code>.then(f, f)</code> 또는 <code>.then(null, f)</code>을 활용하여 에러를 처리할 수 있겠지만 <code>catch()</code>를 사용하는게 더 효율적이다.</p>
</blockquote>
<hr>
<h3 id="03-프로미스-사용-예제">03. 프로미스 사용 예제</h3>
<p>위에서 알아본 내용들을 종합해서 사용해보자.</p>
<ul>
<li>ajax 통신 예제 코드에 프로미스를 적용한 코드이다.<pre><code class="language-javascript">function getJsonData() {
return new Promise(function(resolve, reject) {
  $.get(&#39;https://jsonplaceholder.typicode.com/todos&#39;, function(response) {
    if (response) {
      resolve(response);
    }
    reject(new Error(&quot;서버와 소통이 안된다!!!!&quot;));
  });
});
}
</code></pre>
</li>
</ul>
<p>getJsonData()
  .then(function(result) {
      console.log(result); // response 값 출력
  })
  .catch(function(err) {
      console.error(err); // Error 출력
  });</p>
<pre><code>- 프로미스 체이닝
```javascript
function getJsonData() {
  return new Promise(function(resolve, reject) {
    // ...
  });
}

getJsonData()
  .then(function(result) {
    // ...
  })
  .then(function(result) {
    // ...
  })
  .then(function(result) {
    // ...
  })
  .catch(function(err) {
      // ...
  });</code></pre><p>프로미스 체이닝을 활용해 비동기 코드를 간단하고 더 효율적으로 작성할 수 있다.</p>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise</a></li>
<li><a href="https://ko.javascript.info/promise-basics">https://ko.javascript.info/promise-basics</a></li>
<li><a href="https://joshua1988.github.io/web-development/javascript/promise-for-beginners/">https://joshua1988.github.io/web-development/javascript/promise-for-beginners/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] ajax, setTimeout & 콜백 함수]]></title>
            <link>https://velog.io/@kor-seonwoo/JavaScript-ajax-setTimeout-%EC%BD%9C%EB%B0%B1-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@kor-seonwoo/JavaScript-ajax-setTimeout-%EC%BD%9C%EB%B0%B1-%ED%95%A8%EC%88%98</guid>
            <pubDate>Fri, 20 Oct 2023 10:35:51 GMT</pubDate>
            <description><![CDATA[<p>이전 포스팅에서 알아본 비동기 처리를 사례를 통해서 알아보자.</p>
<h2 id="01-ajax를-활용한-비동기-처리-사례">01. ajax를 활용한 비동기 처리 사례</h2>
<pre><code class="language-javascript">function getData() {
    var tableData;
    $.get(&#39;https://domain.com/products/1&#39;, function(response) {
        tableData = response;
    });
    return tableData;
}

console.log(getData()); // undefined</code></pre>
<p>해당 코드는 <code>ajax</code> 통신으로 <code>HTTP GET</code> 요청을 날려 데이터를 받아오는 비동기 처리 코드이다.
해당 코드가 통신을 잘 주고받았는지 결과값을 한번 봐보자 <code>console.log(getData()); // undefined</code> 결과 값으로 <code>undefined</code>가 출력된다. 요청 코드가 잘못된거라고 생각할 수 있겠지만 <code>undefined</code>가 출력된 이유는 <code>response</code>인자에 요청한 데이터가 담기기도전에 다음코드인 <code>return tableData;</code> 코드를 실행해버렸기 때문이다. </p>
<h2 id="02-settimeout을-활용한-비동기-처리-사례">02. setTimeout을 활용한 비동기 처리 사례</h2>
<pre><code class="language-javascript">// #1
console.log(&#39;Hello&#39;);
// #2
setTimeout(function() {
    console.log(&#39;Bye&#39;);
}, 3000);
// #3
console.log(&#39;Hello Again&#39;);</code></pre>
<p>두번째 사례는 Web API의 한 종류인 <code>setTimeout</code>이다.
<code>setTimeout</code>은 간단하게 셋팅한 시간만큼 기다렸다가 함수 내부의 로직을 실행하는 코드이다.
비동기 처리를 정확하게 이해하지 못했다면 위의 코드 결과값은 아래처럼 나온다 생각할 것이다.</p>
<blockquote>
</blockquote>
<p>  &#39;Hello&#39;
  3초 대기 후 &#39;Bye&#39;
  &#39;Hello Again&#39;</p>
<p>하지만 실제 출력되는 결과 값은 아래와 같이 출력된다.</p>
<blockquote>
</blockquote>
<p>  &#39;Hello&#39;
  &#39;Hello Again&#39;
  3초 대기 후 &#39;Bye&#39;</p>
<p><code>setTimeout</code>도 비동기 방식으로 실행되기 때문에 <code>setTimeout</code>이 실행되면 Web API로 이동된 후 
다음 코드들을 처리한 후 다시 CALL STACK으로 올라와 실행이 된다.</p>
<hr>
<p><code>ajax</code>와 <code>setTimeout</code>을 활용하여 작성된 코드들로 비동기 처리 방식의 사례를 알아보았으니
콜백 함수를 활용하여 본격적인 비동기 처리 코드를 작성해보도록 하자.</p>
<h2 id="03-콜백-함수">03. 콜백 함수</h2>
<pre><code class="language-javascript">function getData(callbackFunc) {
    $.get(&#39;https://domain.com/products/1&#39;, function(response) {
        callbackFunc(response); // 서버에서 받은 데이터 response를 callbackFunc() 함수에 넘겨줌
    });
}

getData(function(tableData) {
    console.log(tableData); // $.get()의 response 값이 tableData에 전달됨
});</code></pre>
<p>해당 코드는 위에서 <code>ajax</code>로 작성했던 사례 코드의 <code>undefined</code>가 출력되는 문제를 콜백 함수를 통해 개선한 코드이다. 콜백 함수 동작 방식에 대해 완벽하게 이해할 수 있도록 작성된 너무 좋은 예시를 인용하였다. </p>
<blockquote>
<p><strong>비유로 이해하는 콜백 함수 동작 방식</strong></p>
</blockquote>
<p>콜백 함수의 동작 방식은 일종의 식당 자리 예약과 같습니다. 
일반적으로 맛집을 가면 사람이 많아 자리가 없습니다. 그래서 대기자 명단에 이름을 쓴 다음에 자리가 날 때까지 주변 식당을 돌아다니죠. 
만약 식당에서 자리가 생기면 전화로 자리가 났다고 연락이 옵니다. 
그 전화를 받는 시점이 여기서의 콜백 함수가 호출되는 시점과 같습니다. 손님 입장에서는 자리가 날 때까지 식당에서 기다리지 않고 근처 가게에서 잠깐 쇼핑을 할 수도 있고 아니면 다른 식당 자리를 알아볼 수도 있습니다.</p>
<blockquote>
</blockquote>
<p>자리가 났을 때만 연락이 오기 때문에 미리 가서 기다릴 필요도 없고, 직접 식당 안에 들어가서 자리가 비어 있는지 확인할 필요도 없습니다. 자리가 준비된 시점, 즉 데이터가 준비된 시점에서만 저희가 원하는 동작(자리에 앉는다, 특정 값을 출력한다 등)을 수행할 수 있습니다.</p>
<hr>
<p>출처 - <a href="https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/#%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EC%9D%98-%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EC%82%AC%EB%A1%80">https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/#%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EC%9D%98-%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EC%82%AC%EB%A1%80</a></p>
<h2 id="04-콜백-지옥">04. 콜백 지옥</h2>
<pre><code class="language-javascript">$.get(&#39;url&#39;, function(response) {
    parseValue(response, function(id) {
        auth(id, function(result) {
            display(result, function(text) {
                console.log(text);
            });
        });
    });
});</code></pre>
<p>위와 같은 코드 구조를 콜백 지옥이라고 하는데, 쉽게 정리하면 콜백 함수 내부에 콜백을 계속 무는 형식을 말한다. 이는 코드의 가독성을 떨어뜨리고 유지보수 측면이나 에러 발생 시 디버깅 작업을 생각하면 어질어질한게 문제점이다.</p>
<p>콜백 지옥을 코딩 패턴으로 해결한다면 아래와 같이 콜백 함수를 분리하여 가독성을 챙길 수 있다..</p>
<pre><code class="language-javascript">function parseValueDone(id) {
    auth(id, authDone);
}
function authDone(result) {
    display(result, displayDone);
}
function displayDone(text) {
    console.log(text);
}
$.get(&#39;url&#39;, function(response) {
    parseValue(response, parseValueDone);
});</code></pre>
<p>다음 포스팅은 더욱 효율적으로 비동기 처리 코드를 작성 할 수 있는 <strong>Promise</strong>에 대해 알아보자.</p>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/#%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EC%9D%98-%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EC%82%AC%EB%A1%80">https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/#%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EC%9D%98-%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EC%82%AC%EB%A1%80</a></li>
<li><a href="https://learnjs.vlpt.us/async/">https://learnjs.vlpt.us/async/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 동기, 비동기 & 이벤트 루프]]></title>
            <link>https://velog.io/@kor-seonwoo/JavaScript-%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%A3%A8%ED%94%84</link>
            <guid>https://velog.io/@kor-seonwoo/JavaScript-%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%A3%A8%ED%94%84</guid>
            <pubDate>Thu, 19 Oct 2023 07:30:13 GMT</pubDate>
            <description><![CDATA[<h2 id="동기-비동기">동기, 비동기</h2>
<p><img src="https://velog.velcdn.com/images/kor-seonwoo/post/ca2efc35-dec7-4f2f-8b13-3aa6cb264a2e/image.png" alt=""> 이미지출처 : <a href="https://learnjs.vlpt.us/async/">https://learnjs.vlpt.us/async/</a></p>
<h3 id="동기"><strong>동기</strong></h3>
<p>코드가 반드시 작성된 순서 그대로 실행된다. 즉, 먼저 시작된 하나의 작업이 끝날 때까지 대기하다가 작업이 끝나면 다음순서의 작업을 시작하는 방식이다.</p>
<blockquote>
<p><strong>동기의 동작 원리</strong></p>
<ol>
<li><code>Call stack</code>에 작성한 코드 순서대로 <strong>push</strong>한다.</li>
<li>쌓인 반대 순서대로 실행한다. (후입선출 LIFO)</li>
<li>실행을 마친 코드는 <code>Call stack</code>에서 <strong>pop</strong>한다.</li>
</ol>
</blockquote>
<h3 id="비동기"><strong>비동기</strong></h3>
<p>코드가 작성된 순서대로 실행되는 것이 아닌 코드이다. 즉, 먼저 시작된 하나의 작업이 끝날 때까지 대기하지 않고 여러 작업이 처리되는 방식이다.</p>
<blockquote>
<p><strong>비동기의 동작 원리</strong></p>
<ol>
<li><code>Call stack</code>에 작성한 코드 순서대로 <strong>push</strong>한다.</li>
<li>도중에 비동기 함수가 <strong>push</strong>되어 쌓이면 <code>Web API</code> 이동 된 후 <code>Call stack</code>에서 <strong>pop</strong>한다.</li>
<li><code>Web API</code>에서 비동기 함수의 이벤트 실행을 마친 후 <code>Callback Queue</code>로 <strong>push</strong>한다. 
그동안 <code>Call stack</code>에서는 다른 코드들을 순차적으로 실행 및 <strong>pop</strong>한다.</li>
<li><code>Call stack</code>이 비어있는것을 <code>Event Loop</code>가 확인한 후 <code>Callback Queue</code>에 대기중인 콜백 함수를 <code>Call stack</code>에 <strong>push</strong>한다.</li>
<li><code>Call stack</code>에 <strong>push</strong>된 함수는 실행을 완료한 후 <strong>pop</strong>되며 실행이 마무리된다.
<img src="https://velog.velcdn.com/images/kor-seonwoo/post/3c60d26e-18a3-44cf-9bee-74e1beecabd7/image.gif" alt=""> 출처 : <a href="https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif">https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif</a>
gif로 설명된 비동기의 동작 원리를 보면 더욱 쉽게 이해 할 수 있다.
(Lydia Hallie님의 자료 덕분에 순식간에 이해할 수 있었다.. 감사합니다!)
(<a href="https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif">https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif</a>)</li>
</ol>
</blockquote>
<hr>
<p><em><strong>References</strong></em>
<a href="https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif">https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif</a>
<a href="https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/">https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/</a>
<a href="https://www.youtube.com/watch?v=8aGhZQkoFbQ">https://www.youtube.com/watch?v=8aGhZQkoFbQ</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTPS]]></title>
            <link>https://velog.io/@kor-seonwoo/HTTPS</link>
            <guid>https://velog.io/@kor-seonwoo/HTTPS</guid>
            <pubDate>Wed, 18 Oct 2023 07:08:07 GMT</pubDate>
            <description><![CDATA[<h2 id="https란">HTTPS란?</h2>
<p>- HTTP는 사용자가 중요한 데이터(계정정보, 금융정보 등)를 서버에 제출할 때 누구나 읽을 수 있는 일반 텍스트형식으로 전송을 하게 된다.
그렇게되면 제3자에게 정보가 유출 될 수 있다는 문제가 발생할 수 있게 된다.
이러한 보안이슈를 커버할 수 있는게 바로 HTTPS인데 HTTPS는 내가 사이트에 보내는 정보들을 제 3자가 못 보게 해주고 접속한 사이트가 믿을 만한 사이트인지를 인증해주는 <strong>HTTP에 데이터 암호화가 추가된 프로토콜</strong>이다.</p>
<h3 id="https-암호화-방식">HTTPS 암호화 방식</h3>
<ul>
<li><p>대칭키 암호화
-클라이언트와 서버가 <strong>동일한 키</strong>로 암호화/복호화를 진행한다.
-연산속도가 빠르다.
-하지만 대칭키가 노출 된다면 무용지물...</p>
</li>
<li><p>비대칭키 암호화
- 1개의 쌍으로 구성된 <strong>공개키</strong>와 <strong>개인키</strong>로 암호화/복호화를 진행한다.
- 연산속도가 느리다.</p>
<blockquote>
<p>✨ <strong>개인키</strong></p>
<ul>
<li>웹 사이트 소유자가 관리하며, 비공개로 유지된다.</li>
<li>키는 웹 서버에 있으며 공개 키로 암호화된 정보를 복호화 하는데 사용된다.</li>
</ul>
</blockquote>
<blockquote>
<p>✨ <strong>공개키</strong></p>
<ul>
<li>웹 사이트 소유자가 관리하며, 비공개로 유지된다.</li>
<li>서버에서 응답받은 데이터 중 일부는 개인키로 암호화 되어있는데 이를 공개키로 복호화할 수 있다.</li>
</ul>
</blockquote>
</li>
</ul>
<h3 id="https-동작-과정">HTTPS 동작 과정</h3>
<p>HTTPS는 대칭키와 비대칭키를 모두 사용하는데, 먼저 서버와 클라이언트가 처음 연결을 할때 비대칭키를 사용하고 안정성이 확보된 후엔 대칭키를 사용하여 빠른 연산 속도를 활용한 통신을 하게 된다. 이러한 연결 과정을 단계별로 살펴보면 다음과 같다.</p>
<blockquote>
<ol>
<li><strong>Client Hello 와 Server Hello</strong>
 1-1) Client → Server : <span style="color: green">클라이언트 측에서 생성한 랜덤 데이터</span>
 1-2) Server → Client : <span style="color: orange">서버 측에서 생성한 랜덤 데이터</span>, 인증서</li>
<li><strong>서버에서 보내온 인증서의 진위여부를 확인하고 서버의 신뢰성을 보장 받는다.</strong>
 2-1) 서버측에서 보내온 인증서가 CA(Certificate Authority)의 인증서가 맞다면 해당 CA의 개인키로 암호화 되어있다.
 2-2) 각각의 브라우저들은 CA들의 공개키가 내장되어있기 때문에 해당 공개키를 사용하여 복호화 하여 인증서의 진위여부 및 공개키를 얻게 된다.</li>
<li><strong>session key 생성</strong>
 3-1) <span style="color: green">클라이언트 측에서 생성한 랜덤 데이터</span>와 <span style="color: orange">서버 측에서 생성한 랜덤 데이터</span>를 조합하여 pre master secret키를 생성한다.
 3-2) 생성된 pre master secret키를 서버 공개키로 암호화하여 서버로 전송하면 서버에서는 개인키를 사용하여 복호화를 진행하고 이후 서버와 클라이언트는 모두 일련의 과정을 거쳐 <span style="color: red"><strong>session key</strong></span>를 생성한다.</li>
<li><strong>세션</strong>
 서버와 클라이언트가 데이터를 주고 받는 단계이다. 이 단계에서부터는 대칭키 방식으로 암호화를 진행하여 데이터를 송수신하는데 그 대칭키가 바로 session key값을 활용한다는 것이다.</li>
<li><strong>세션 종료</strong>
 데이터의 전송이 끝나면 통신에 사용된 대칭키인 session key는 폐기된다.</li>
</ol>
</blockquote>
<hr>
<p><em><strong>References</strong></em>
<a href="https://mangkyu.tistory.com/98">https://mangkyu.tistory.com/98</a>
<a href="https://www.yalco.kr/31_https/">https://www.yalco.kr/31_https/</a>
<a href="https://dong5854.tistory.com/30">https://dong5854.tistory.com/30</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP 프로토콜 이해]]></title>
            <link>https://velog.io/@kor-seonwoo/HTTP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@kor-seonwoo/HTTP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Tue, 17 Oct 2023 09:21:33 GMT</pubDate>
            <description><![CDATA[<h2 id="httphypertext-transfer-protocol란">HTTP(Hypertext Transfer Protocol)란?</h2>
<ul>
<li>HTTP는 서버와 클라이언트가 인터넷상에서 데이터를 주고 받기 위한 프로토콜이다.</li>
<li>일반적으로 전송 계층 프로토콜로 TCP, 네트워크 계층 프로토콜로 IP를 사용한다.</li>
<li>HTTP는 기본적으로 80번 포트를 사용한다.</li>
</ul>
<h2 id="http-작동방식">HTTP 작동방식</h2>
<p><img src="https://velog.velcdn.com/images/kor-seonwoo/post/d8fee5d9-d4a4-489c-9a74-8531ba488fdd/image.png" alt="">이미지 출처 : <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview">https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview</a></p>
<ul>
<li>HTTP는 서버/클라이언트 모델을 따른다.</li>
<li><em>클라이언트가 서버에게 요청(request)*</em>을 보내면 <strong>서버는 클라이언트에게 응답(response)</strong>을 보낸 후 클라이언트와 연결을 끊는다.</li>
<li>위와 같은 작동방식의 특징 갖고 있어 <strong>HTTP는 무상태 프로토콜</strong>이라고 불린다.</li>
</ul>
<p>이러한 작동방식으로 HTTP의 장단점은 이렇게 정리할 수 있다.</p>
<blockquote>
<p><strong>장점</strong></p>
</blockquote>
<ul>
<li>불특정 다수를 대상으로 하는 서비스에 적합</li>
<li>클라이언트와 서버가 지속적으로 연결되어 소통하는 방식이 아니기에 정해진 최대 연결수보다 훨씬 많은 요청과 응답을 처리할 수 있다.</li>
</ul>
<blockquote>
<p><strong>단점</strong></p>
</blockquote>
<ul>
<li>응답(response) 후 연결을 끊어버리기 때문에, 클라이언트의 이전상황을 알 수 없다.
다시말해 클라이언트가 바로 다음 요청을 한다해도 서버는 이 클라이언트가 방금 전 요청을 했던 클라이언트와 동일한지 알 수 없다는 것이다.</li>
</ul>
<p>위와 같은 무상태(Stateless) 특징때문에 정보를 유지하기 위한 목적으로 <a href="https://developer.mozilla.org/ko/docs/Glossary/Cookie">Cookie</a>, <a href="https://developer.mozilla.org/ko/docs/Web/API/Storage">Web storage</a>와 같은 기술이 등장하였다.</p>
<h2 id="http-메시지">HTTP 메시지</h2>
<p><img src="https://velog.velcdn.com/images/kor-seonwoo/post/03a2341d-1499-4acc-810b-306e41a1fbdb/image.png" alt="">이미지 출처 : <a href="https://www.boostcourse.org/web316/lecture/16661?isDesc=false">https://www.boostcourse.org/web316/lecture/16661?isDesc=false</a></p>
<h3 id="1-요청-데이터-포맷-request-messages">1. 요청 데이터 포맷 (request messages)</h3>
<ul>
<li>요청헤더, 한줄공백, 요청바디로 이루어져 있다.<h3 id="-요청헤더">* 요청헤더</h3>
```
GET /servlet/query?a=10&amp;b=90 HTTP/1.1
/** </li>
<li>GET : 요청 메서드</li>
<li>/servlet/query?a=10&amp;b=90 : 요청 URL</li>
<li>HTTP/1.1 : HTTP 프로토콜 버전</li>
<li>*/
Host : <a href="http://www.sk.com">www.sk.com</a> 
User-agent: mozilla/4.0
Accept-language: kr<pre><code>#**요청 메서드**
= 요청 메서드는 송수신 방법을 뜻한다.
</code></pre></li>
</ul>
<blockquote>
<p><strong>*주요 메서드</strong></p>
</blockquote>
<ul>
<li><strong>GET</strong> : 리소스 조회</li>
<li><strong>POST</strong> : 요청 데이터 처리, 주로 데이터 등록에 사용</li>
<li><strong>PUT</strong> : 리소스를 대체, 해당 리소스가 없으면 생성</li>
<li><strong>DELETE</strong> : 리소스 삭제</li>
<li><strong>PATCH</strong> : 리소스 일부 변경</li>
</ul>
<blockquote>
<p><strong>*기타 메서드</strong></p>
</blockquote>
<ul>
<li><strong>HEAD</strong>: GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환</li>
<li><strong>OPTIONS</strong>: 대상 리소스에 대한 통신 가능 옵션을 설명(주로 CORS에서 사용)</li>
<li><strong>CONNECT</strong>: 대상 자원으로 식별되는 서버에 대한 터널을 설정</li>
<li><strong>TRACE</strong>: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행</li>
</ul>
<p>#<strong>요청 URL</strong>
= 요청 타겟을 나타내며, 이들은 요청 컨텍스트에 의해 특정 지어진다.</p>
<p>#<strong>HTTP 프로토콜 버전</strong>
= 웹 브라우저가 사용하는 HTTP 프로토콜 버전을 의미한다.</p>
<p>두번째 줄 부터는 여러 줄의 헤더 정보가 키-벨류 쌍으로 이루어져 있다.</p>
<h3 id="-한줄공백">* 한줄공백</h3>
<ul>
<li>요청헤더가 끝난 후 한줄공백 이후에 요청바디가 등장한다.<h3 id="-요청바디">* 요청바디</h3>
</li>
<li>요청바디는 POST, PUT메서드를 사용하였을때만 존재.</li>
</ul>
<h3 id="2-응답-데이터-포맷-response-messages">2. 응답 데이터 포맷 (response messages)</h3>
<ul>
<li>응답헤더, 한줄공백, 응답바디로 이루어져 있다.<h3 id="-응답헤더">* 응답헤더</h3>
```
HTTP/1.1 200 ok
/** </li>
<li>HTTP/1.1 : 응답 HTTP 프로토콜 버전</li>
<li>200 : 응답 코드</li>
<li>ok : 응답 메시지</li>
<li>*/
Date : Thu, 03 jul 2003 12:00:15 GMT
Server: Apache/1.3.0 (Unix)
Last-Modified: Sun, 5 May 2003 09:23:24 GMT
Content-Length: 6821
Content-Type: text/html</li>
</ul>
<html>
  ........
</html>
```
#**상태 코드**
= HTTP 요청이 성공적으로 이루어졌는지를 의미한다.

<p><strong>*주요 상태 코드</strong></p>
<blockquote>
<p><strong>2xx</strong>
- 요청 정상 처리</p>
</blockquote>
<ul>
<li><strong>200 OK</strong> : 요청 성공</li>
<li><strong>201 Created</strong> : 요청 성공해서 새로운 리소스가 생성됨</li>
<li><strong>202 Accepted</strong> : 요청이 접수되었으나 처리가 완료되지 않았음</li>
<li><strong>204 No Content</strong> : 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음</li>
</ul>
<blockquote>
<p><strong>3xx</strong>
-요청을 완료하려면 추가 행동이 필요 (리다이렉션)</p>
</blockquote>
<ul>
<li><strong>301 Moved Permanently</strong> : 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음</li>
<li><strong>302 Found</strong> : 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음</li>
<li><strong>303 See Other</strong> : 리다이렉트시 요청 메서드가 GET으로 변경</li>
<li><strong>304 Not Modified</strong> : 캐시를 목적으로 사용</li>
<li><strong>307 Temporary Redirect</strong> : 리다이렉트시 요청 메서드와 본문 유지(요청 메서드를 변경하면 안된다.)</li>
<li><strong>308 Permanent Redirect</strong> : 리다이렉트시 요청 메서드와 본문 유지(처음 POST를 보내면 리다이렉트도 POST 유지)</li>
</ul>
<blockquote>
<p><strong>4xx</strong> 
-클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음</p>
</blockquote>
<ul>
<li><strong>400 Bad Request</strong> : 클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음</li>
<li><strong>401 Unauthorized</strong> : 클라이언트가 해당 리소스에 대한 인증이 필요함</li>
<li><strong>403 Forbidden</strong> : 서버가 요청을 이해했지만 승인을 거부함</li>
<li><strong>404 Not Found</strong> : 요청 리소스를 찾을 수 없음</li>
</ul>
<blockquote>
<p><strong>5xx</strong> 
-서버 오류, 서버가 정상 요청을 처리하지 못함</p>
</blockquote>
<ul>
<li><strong>500 Internal Server Error</strong> : 서버 문제로 오류 발생, 애매하면 500 오류</li>
<li><strong>503 Service Unavailable</strong> : 서비스 이용 불가</li>
</ul>
<p>두번째 줄 부터는 여러 줄의 헤더 정보가 키-벨류 쌍으로 이루어져 있다.</p>
<h3 id="-한줄공백-1">* 한줄공백</h3>
<ul>
<li>응답헤더가 끝난 후 한줄공백 이후에 응답바디가 등장한다.<h3 id="-요청바디-1">* 요청바디</h3>
</li>
<li>실제 응답 리소스 데이터가 나오는 부분이다. 데이터의 형식은 요청 헤더에 지정된 타입을 따른다.</li>
</ul>
<hr>
<p><em><strong>References</strong></em></p>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview">https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview</a></li>
<li><a href="https://www.boostcourse.org/web316/lecture/16661?isDesc=false">https://www.boostcourse.org/web316/lecture/16661?isDesc=false</a></li>
<li><a href="https://velog.io/@haron/HTTP-%EB%A9%94%EC%84%9C%EB%93%9C%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%84%EB%8A%94%EB%8C%80%EB%A1%9C-%EB%A7%90%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94">https://velog.io/@haron/HTTP-%EB%A9%94%EC%84%9C%EB%93%9C%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%84%EB%8A%94%EB%8C%80%EB%A1%9C-%EB%A7%90%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94</a></li>
<li><a href="https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-HTTP-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%A2%85%EB%A5%98-%ED%86%B5%EC%8B%A0-%EA%B3%BC%EC%A0%95-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC">https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-HTTP-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%A2%85%EB%A5%98-%ED%86%B5%EC%8B%A0-%EA%B3%BC%EC%A0%95-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC</a></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>