<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>lire_eruel.log</title>
        <link>https://velog.io/</link>
        <description>어제보단 오늘이 더 강한 웹/앱 개발자입니다</description>
        <lastBuildDate>Sat, 26 Aug 2023 06:43:34 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>lire_eruel.log</title>
            <url>https://velog.velcdn.com/images/lire_eruel/profile/7c01e4bb-47fd-45fe-81cc-d083e38a8c91/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. lire_eruel.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lire_eruel" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[HTML과 소개팅하기]]></title>
            <link>https://velog.io/@lire_eruel/HTML%EA%B3%BC-%EC%86%8C%EA%B0%9C%ED%8C%85%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@lire_eruel/HTML%EA%B3%BC-%EC%86%8C%EA%B0%9C%ED%8C%85%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 26 Aug 2023 06:43:34 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>이 글은 body을 처음 배우는 사람을 위한 글 입니다. 쉬운 이해를 위해 JAVA에 비유해서 설명을 할 예정입니다. 앞으로 【자유법】은 자바식 비유라고 생각해주세요.</p>
</blockquote>
<h1 id="html이란">HTML이란?</h1>
<p>HTML HyperText Markup Language의 약자로, 마크업 언어입니다.
웹 페이지의 구조와 콘텐츠를 정의하는데 사용되며, 웹 페이지를 브라우저에서 표시할 때 사용됩니다.
웹 페이지에 있는 텍스트, 이미지, 링크, 비디오 등의 요소를 구조화하고 레이아웃을 정의합니다.</p>
<h3 id="코드로-먼저-봅시다">코드로 먼저 봅시다.</h3>
<h3 id="html-코드">HTML 코드</h3>
<pre><code>&lt;!DOCTYPE html&gt; //전 HTML입니다
&lt;html&gt; // 【자유법】class 파일의 최 상단 class 선언하고 감싸는 부분
&lt;head&gt; // 【자유법】import 처럼 문서 상단에 필요한 것들을 정의하는 부분
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt; // 브라우저의 상단바에 나올 이름
&lt;/head&gt;
&lt;body&gt; // 실제 화면에 보이는 부분【자유법】 메인 메소드
    &lt;h1&gt; 제목입니다. &lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><blockquote>
<p>실제 코드에 저런식으로 주석하면 안됩니다!!
보기 쉽게 적어놓았습니다. 주석은 조금 뒤에 알려드릴게요!
지금 이해할 필요 없어요. 밑에 자세한 설명이 있으니까요!</p>
</blockquote>
<h3 id="태그-사용법">태그 사용법</h3>
<h3 id="1-태그는-정해진-태그를-사용합니다-java처럼-마음대로-선언하면-안돼요">1. 태그는 정해진 태그를 사용합니다. Java처럼 마음대로 선언하면 안돼요.</h3>
<pre><code class="language-html">// good!
&lt;a&gt; 나는 anchor 태그야. &lt;/a&gt;
// error! (아무것도 보이지 않아요!)
&lt;ssafy&gt; 나는 ssafy야. &lt;/ssafy&gt;</code></pre>
<p><del>사실 커스텀 태그를 만들 수 있긴 합니다.</del> </p>
<h3 id="2-태그-공통-문법">2. 태그 공통 문법</h3>
<p>닫는 태그는 앞부분이 &lt;/ 라는 점 알아두기!</p>
<blockquote>
<p>&lt;여는 태그&gt; 내용 &lt;/닫는 태그&gt;</p>
</blockquote>
<p>ex)</p>
<pre><code>&lt;h4&gt; h4는 제목 태그 중 하나에요. &lt;/h4&gt;</code></pre><p>결과</p>
<h4> h4는 제목 태그 중 하나에요.  </h4>

<h3 id="3-주석달기">3. 주석달기</h3>
<pre><code>```
&lt;div&gt;
    &lt;p&gt; 알고리즘은 역시 일구리즘이지&lt;/p&gt;
    &lt;!-- 아 좀 그런가..? --&gt;
&lt;/div&gt;
```</code></pre><h4 id="결과">결과</h4>
<hr>
  <div>
      <p> 알고리즘은 역시 일구리즘이지</p>
      <!-- 아 좀 그런가..? -->
  </div>

<hr>
<ul>
<li>아 좀 그런가..? 라는 텍스트는 보이지 않네요! &quot; &lt;!--와 --&gt; 를 사용하면 주석을 추가할 수 있습니다.</li>
</ul>
<hr>
<h2 id="태그-종류를-다-알아봐야할까">태그 종류를 다 알아봐야할까?</h2>
<p>HTML의 태그는 종류가 어마무시하게 많습니다...! 이걸 전부 다 알려고 하는 것은 비효율적이죠.
<a href="https://www.w3schools.com/tags/default.asp">W3S에서 어떤 태그들이 있는지 구경하세요!</a></p>
<p>그렇다면 자주 쓰이는 것들만 알아도 중간은 가겠죠?</p>
<p><a href="https://www.advancedwebranking.com/seo/html-study/#overview">Advanced Web Ranking</a>의 조사 결과를 한번 봅시다.</p>
<p>아래 그래프는 하나의 웹페이지에서 사용된 태그 종류의 합을 나타낸 것입니다.
<img src="https://velog.velcdn.com/images/lire_eruel/post/64537aaf-0044-430d-ad68-fc9d24e6181b/image.png" alt="웹에서 쓰이는 태그 갯수">
생각보다 많지는 않죠? 32개가 가장 많네요
아래는 태그가 많이 사용되는 순위입니다.
<img src="https://velog.velcdn.com/images/lire_eruel/post/2cb52f65-b96d-4afc-a4e3-2e37db2facdd/image.png" alt=""></p>
<p><a href="https://velog.io/@john_with_smile/%EA%B0%80%EC%9E%A5-%EB%A7%8E%EC%9D%B4-%EC%93%B0%EC%9D%B4%EB%8A%94-%ED%83%9C%EA%B7%B8-%EC%A2%85%EB%A5%98">가장 많이 쓰이는 태그 알아보기</a>&lt;&lt;- 이 곳에 들어가서 한 번 훑어봅시다.</p>
<h2 id="개발-환경-추천window">개발 환경 추천(window)</h2>
<p>우선 VSCode를 설치해줍시다.
좌측에 아래 이모티콘같이 생긴 것을 눌러주세요.</p>
<p>꼭 다 설치해야하나요? &lt;&lt; 아닙니다 하지만 우리 프린이 여러분들은 그냥 시키는대로 따라오세요.</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/a35f475a-813d-470e-86a0-d4e48877dbba/image.png" alt=""></p>
<p>이제 html을 검색해서 아래 HTML CSS Support 설치</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/b7856807-7aba-4298-9a84-311e0607e162/image.png" alt=""></p>
<p>live Server 설치</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/de6696ed-c048-405b-a24e-2d76e97585ac/image.png" alt=""></p>
<p>CSS Peek</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/c7dfb521-a835-48ca-b703-662979492fbf/image.png" alt=""></p>
<h2 id="시작하기">시작하기</h2>
<p>VSCode 실행 후 폴더 지정해서 열어주세요. </p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/3d121b66-f07d-4565-b40e-be1a89e0ae0c/image.png" alt=""></p>
<p>폴더에 마우스 커서를 가져다 대면 이런 메뉴가 보입니다. 제일 왼쪽 클릭해주세요.
<img src="https://velog.velcdn.com/images/lire_eruel/post/2af15999-3f13-4196-936a-1515f9f529e3/image.png" alt=""></p>
<p>이 상태에서 hello.html 입력 후 엔터</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/6c1f94ef-1f6b-48f6-aac9-fc4ea0f8494c/image.png" alt=""></p>
<p>이 상황에서 html 입력해주세요.
그럼 아래처럼 무언가 뜰텐데 두번째 html:5 선택
<img src="https://velog.velcdn.com/images/lire_eruel/post/13b7a541-1a6c-41c2-84f0-fa4ecac27fb3/image.png" alt=""></p>
<p>그럼 짠! HTML 문서의 기본 틀 완성!</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/f4cf35b6-d79b-4ec2-8cb1-fa6a30aa2f70/image.png" alt=""></p>
<p>이제 ALT를 누른 상태에서 L과 O를 눌러주세요. 그럼 기본 브라우저로 새로운 창이 열립니다!
혹시 잘 안된다면 html문서를 우클릭 한 후 ! open in live server를 클릭해주세요.</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/b93e76c0-dd7e-49cf-bdb5-25030dce7920/image.png" alt=""></p>
<p>그럼 이렇게 결과가 짠! </p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/c8f879a5-57f0-4dc8-8c63-0eba24c226b7/image.png" alt=""></p>
<p>이제 title도 변경해보고 body에도 요소들을 추가해보면서 html을 다뤄봐요!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] Array vs Linked List]]></title>
            <link>https://velog.io/@lire_eruel/TIL-Array-vs-Linked-List</link>
            <guid>https://velog.io/@lire_eruel/TIL-Array-vs-Linked-List</guid>
            <pubDate>Mon, 24 Jul 2023 15:43:09 GMT</pubDate>
            <description><![CDATA[<h1 id="array">Array</h1>
<h2 id="array란">Array란?</h2>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/07fb3f0b-d853-49ae-ab9d-0fbfeb05bb0d/image.png" alt=""></p>
<p>Array는 프로그래밍에서 일련의 요소들을 순차적으로 저장하는 데이터 구조입니다. 이러한 요소들은 같은 데이터 타입을 가지며, 각 요소는 배열 안에서 인덱스(index)라고 불리는 숫자로 접근할 수 있습니다. 인덱스는 보통 0부터 시작하여 배열의 크기보다 하나 작은 값을 가집니다.</p>
<p>예를 들어, 5개의 정수를 저장하는 배열은 다음과 같이 표현할 수 있습니다:</p>
<pre><code>[10, 20, 30, 40, 50]</code></pre><h2 id="array-장점">Array 장점</h2>
<h3 id="요소에-빠르게-접근할-수-있다">요소에 빠르게 접근할 수 있다.</h3>
<p>가장 기본적인 자료구조인 Array는 논리적 저장 순서와 물리적 저장 순서가 일치한다.
따라서 인덱스로 해당 원소에 Big-O(1)에 해당 원소로 접근할 수 있다. 즉 random access가 가능하다. </p>
<h2 id="array-단점">Array 단점</h2>
<h3 id="삽입이나-삭제가-비효율적이다">삽입이나 삭제가 비효율적이다.</h3>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/024a2dbf-7a78-4b84-8f2d-1ee6b3792435/image.png" alt=""></p>
<p>삽입 또는 삭제 과정에서는 해당 원소에 접근하여 작업을 완료한 뒤(O(1)), 또 한 가지의 작업을 추가적으로 해줘야 하기 때문에, 시간이 더 걸린다. 
만약 삭제라고 한다면, 중간에 원소를 삭제하고 그 뒤부터 요소들을 shift해줘야 하기 때문에 시간 복잡도는 O(n)이 된다.
삽입 또한 마찬가지 이다.</p>
<h3 id="크기가-고정적이다">크기가 고정적이다.</h3>
<p>Array는 생성할 때 크기를 지정하고 이후에 크기를 동적으로 변경할 수 없습니다. 만약 배열의 크기를 초과하여 데이터를 추가하려면, 새로운 배열을 생성하고 기존의 데이터를 복사해야 합니다. 이로 인해 삽입과 삭제가 비효율적이며, 크기를 자주 변경해야 하는 경우에는 다른 자료구조를 고려해야 합니다.</p>
<h1 id="linked-list">Linked List</h1>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/3b43068b-aefa-4b9d-a712-05caebd911b0/image.png" alt=""></p>
<p>Linked List(연결 리스트)는 배열의 삽입과 삭제가 비효율적인 문제를 해결하기 위한 자료구조입니다. Linked List는 각 노드(Node)들이 데이터와 다음 노드를 가리키는 포인터(주소)로 구성됩니다. 각 노드들이 연결되어 있기 때문에 순차적으로 데이터를 저장하지 않고, 논리적으로 연결되어 있는 형태로 데이터를 관리합니다.</p>
<h2 id="linked-list-장점">Linked List 장점</h2>
<h3 id="삽입이나-삭제가-빠르다">삽입이나 삭제가 빠르다.</h3>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/2792a595-dd26-44f8-888e-872433a7d0b2/image.png" alt="">
각각의 원소들은 자기 자신 다음에 어떤 원소인지만을 기억하고 있다. 
삽입이나 삭제를 할 때 해당 부분만 다른 값으로 변경하면 되기 때문에 삽입과 삭제를 O(1)만에 해결할 수 있다.</p>
<h3 id="동적-크기">동적 크기</h3>
<p>배열과 달리 동적으로 크기를 조정할 수 있습니다. 필요에 따라 노드를 추가하거나 제거할 수 있습니다.</p>
<h2 id="linked-list-단점">Linked List 단점</h2>
<h3 id="결국-삽입이나-삭제가-on시간이-필요하다">결국 삽입이나 삭제가 O(n)시간이 필요하다.</h3>
<p>원하는 위치에 삽입을 하고자 하면 원하는 위치를 Search 과정에 있어서 첫번째 원소부터 다 확인해봐야 한다는 것이다. Array 와는 달리 논리적 저장 순서와 물리적 저장 순서가 일치하지 않기 때문이다. 이것은 일단 삽입하고 정렬하는 것과 마찬가지이다. 이 과정 때문에, 어떠한 원소를 삭제 또는 추가하고자 했을 때, 그 원소를 찾기 위해서 O(n)의 시간이 추가적으로 발생하게 된다.</p>
<h2 id="linked-list의-종류">Linked List의 종류</h2>
<h3 id="단일-연결-리스트-singly-linked-list">단일 연결 리스트 (Singly Linked List)</h3>
<p>단일 연결 리스트는 각 노드가 데이터와 다음 노드를 가리키는 하나의 포인터로 구성됩니다. 리스트의 시작 노드를 가리키는 특별한 포인터인 헤드(Head)가 있으며, 리스트의 끝은 NULL로 표시됩니다.</p>
<h3 id="이중-연결-리스트-doubly-linked-list">이중 연결 리스트 (Doubly Linked List)</h3>
<p>이중 연결 리스트는 단일 연결 리스트와 비슷하지만, 각 노드가 데이터와 이전 노드와 다음 노드를 가리키는 두 개의 포인터로 구성됩니다. 이전 노드를 가리키는 포인터를 추가함으로써, 뒤에서부터도 리스트를 순회할 수 있습니다. 이중 연결 리스트는 메모리 공간을 더 많이 사용한다는 단점이 있습니다.</p>
<h3 id="원형-연결-리스트-circular-linked-list">원형 연결 리스트 (Circular Linked List)</h3>
<p>원형 연결 리스트는 단일 연결 리스트와 유사하지만, 마지막 노드가 첫 번째 노드를 가리키게 됩니다. 이렇게 함으로써, 끝과 시작이 연결되어 순환하는 구조가 됩니다. 원형 연결 리스트는 특정 작업을 순환적으로 처리해야 할 때 유용합니다.</p>
<h1 id="언제-array와-linked-list를-사용할까">언제 Array와 Linked List를 사용할까?</h1>
<h2 id="array-1">Array</h2>
<p>데이터의 크기가 미리 정해져 있고, 빠른 인덱스 접근이 필요한 경우에 적합합니다.</p>
<h2 id="linked-list-1">Linked List</h2>
<p>데이터의 크기가 동적으로 변경되거나 삽입과 삭제가 빈번한 경우에 적합합니다. 또한 메모리 사용에 유연성이 필요한 경우에도 유용합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] TDD, 함수형 프로그래밍]]></title>
            <link>https://velog.io/@lire_eruel/TIL-TDD-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</link>
            <guid>https://velog.io/@lire_eruel/TIL-TDD-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</guid>
            <pubDate>Wed, 19 Jul 2023 13:50:46 GMT</pubDate>
            <description><![CDATA[<h1 id="tdd">TDD</h1>
<h2 id="tdd란-무엇인가">TDD란 무엇인가?</h2>
<p>TDD란 Test Driven Development의 줄임말로 &#39;테스트 주도 개발&#39;이라고 한다.
테스트 주도 개발은 설계 이후 코드 개발 및 테스트 케이스를 작성하는 기존의 개발 프로세스와 다르게 테스트케이스를 작성 한 후 실제 코드를 개발하여 리펙토링하는 절차를 따른다.</p>
<h2 id="tdd의-장점">TDD의 장점</h2>
<h3 id="1--함수-리팩토링이-쉬워진다">1.  함수 리팩토링이 쉬워진다.</h3>
<p>코드 양이 많아진 상황에서는 좋은 코드를 작성할 때 고려해야하는 요소를 모두 지키며 작성하기 쉽지 않다. 하지만 테스트 주도 개발을 통해 개발을 하면 뚱뚱해진 함수를 여러 함수로 나누는 과정에서 해당 기능이 오작동을 일으킬 수 있지만 간단히 테스트를 돌려봄으로써 이에 대한 안심을 하고 계속해서 리팩토링을 진행할 수 있다. 결과적으로 리팩토링 속도도 빨라지고 코드의 퀄리티가 좋아진다.</p>
<h3 id="2-요구사항에-더욱-집중-할-수-있다">2. 요구사항에 더욱 집중 할 수 있다.</h3>
<p>새로운 기능을 추가하기 전 테스트를 먼저 작성한다.
이 를 위해서는 개발자는 해당 기능의 요구사항과 명세를 분명히 이해하고 있어야 한다.
이는 사용자 케이스와 사용자 스토리 등으로 이해할 수 있으며, 개발자가 코드 작성 전에 요구사항에 더욱 집중할 수 있도록 도와준다.</p>
<h2 id="tdd의-단점">TDD의 단점</h2>
<h3 id="1-느린-생산성">1. 느린 생산성</h3>
<p>기존 코드에 테스트코드까지 작성해야 해서 필요한 코드의 양이 늘어난다.
코드의 퀄리티보다는 빠른 생산성이 요구되는 시점에서 TDD는 추천하지 않는다.</p>
<h3 id="2-진입-장벽">2. 진입 장벽</h3>
<p>어떠한 부분을 어떻게 테스트해야하는지 등 여러 부분에 대한 학습이 필요하고 익숙해져야 한다.
또한 팀 전체가 익숙해져야 하므로 진입 장벽이 높다.</p>
<h1 id="함수형-프로그래밍">함수형 프로그래밍</h1>
<h2 id="함수형-프로그래밍이란">함수형 프로그래밍이란?</h2>
<blockquote>
<p><em>Functional Programming is programming without assignment satements</em>
_함수형 프로그래밍은 대입문이 없는 프로그래밍이다. _
 _ -Rober C.Martin(클린 코드 저자)- _</p>
</blockquote>
<p>함수형 프로그래밍은 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.</p>
<h2 id="immutable-vs-mutable">immutable vs mutable</h2>
<h3 id="immutable">immutable</h3>
<p>immutable 객체는 객체가 가지고 있는 값을 변경할 수 없는 객체를 의미한다. 값이 변경될 경우, 새로운 객체를 생성하고 변경된 값을 주입하여 반환해야 한다.</p>
<h3 id="mutable">mutable</h3>
<p>mutable 객체는 해당 객체의 값이 변경될 경우 값을 변경한다.</p>
<h2 id="일급-객체-first-class-citizen">일급 객체 (first-class citizen)</h2>
<h3 id="일급-객체란">일급 객체란?</h3>
<ul>
<li>변수나 데이터 구조 안에 함수를 담을 수 있어서 함수의 파라미터로 전달할 수 있고, 함수의 반환값으로 사용할 수 있다.</li>
<li>할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.</li>
<li>함수를 리터럴로 바로 정의할 수 있다.</li>
</ul>
<blockquote>
<p>함수형 프로그래밍에서 함수(function)는 일급 객체로 간주된다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] OOP, Restful API]]></title>
            <link>https://velog.io/@lire_eruel/TIL-OOP-Restful-API</link>
            <guid>https://velog.io/@lire_eruel/TIL-OOP-Restful-API</guid>
            <pubDate>Tue, 18 Jul 2023 13:26:30 GMT</pubDate>
            <description><![CDATA[<h1 id="객체-지향-프로그래밍">객체 지향 프로그래밍</h1>
<h3 id="객체-지향-프로그래밍의-장점">객체 지향 프로그래밍의 장점</h3>
<ol>
<li>이미 작성한 코드에 대한 재사용성이 높다.</li>
<li>객체 단위로 코드가 나눠져 작성되기 때문에 디버깅이 쉽고 유지보수에 용이하다.</li>
<li>데이터 모델링을 할 때 객체와 매필하는 것이 수월하기 때문에 요구사항을 보다 명확하게 파악하여 프로그래밍 할 수 있다.</li>
</ol>
<h3 id="객체-지향적-설계-원칙">객체 지향적 설계 원칙</h3>
<ol>
<li>SRP(Single Resposibility Principle) : 단일 책임 원칙<ul>
<li>클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유여야 한다.</li>
</ul>
</li>
<li>OCP(Open-Closed Principle) : 개방-폐쇄 원칙
확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.</li>
<li>LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.</li>
<li>ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.</li>
<li>DIP(Dependency Inversion Principle) : 의존 역전 원칙
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.</li>
</ol>
<h2 id="restful-api">Restful API</h2>
<h3 id="restful-api란">Restful API란?</h3>
<p>REST란 ,  REpresentational State Transfer 의 약자이다. 
REST에서 &quot;Representational State&quot;는 자원의 상태를 표현하는 것을 의미한다. 시스템의 리소스를 표현하는데 사용되는 표현은 클라이언트와 서버 간에 주고받는 데이터 형식이다. 주로 JSON 혹은 XML 형태의 데이터를 사용한다.</p>
<p>&quot;Transfer&quot;는 클라이언트와 서버 간의 데이터 전송을 의미한다. REST는 HTTP 프로토콜을 기반으로 하며, 클라이언트는 HTTP 메소드(GET, POST, PUT, DELETE 등)를 사용하여 서버의 리소스를 조작하고 요청한다.</p>
<p>따라서, REST는 웹 시스템에서 클라이언트와 서버 간의 상호작용을 위한 아키텍처 스타일로서, 자원의 표현과 상태 전송을 중심으로 하는 웹 API 디자인을 의미한다.</p>
<h3 id="rest-6가지-원칙">REST 6가지 원칙</h3>
<h4 id="uniform-interface-일관된-인터페이스">Uniform Interface (일관된 인터페이스)</h4>
<ul>
<li>클라이언트와 서버 간의 통신을 위한 인터페이스가 일관성 있게 설계되어야 한다.<ul>
<li>리소스 식별, 리소스 조작을 위한 통일된 방식을 사용하고, 메시지 형식 및 프로토콜도 통일된 규칙을 따라야 함<h4 id="stateless">Stateless</h4>
</li>
</ul>
</li>
<li>클라이언트와 서버 간의 세션 상태를 서버에 저장하지 않고, 각 요청이 독립적으로 처리되도록 설계되어야 한다. 클라이언트는 필요한 모든 정보를 요청에 포함시켜야 하며, 서버는 각 요청을 별개의 요청으로 이해하고 처리한다.  -&gt; 서버의 확장성과 재사용성이 향상됨.<h4 id="caching">Caching</h4>
</li>
<li>서버 응답을 클라이언트나 중간 서버에서 캐시로 저장하여, 동일한 요청이 반복될 때 캐시된 응답을 사용함으로써 네트워크 대역폭을 절약하고 응답 시간을 단축시킨다.<h4 id="client-server">Client-Server</h4>
</li>
<li>RESTful API는 클라이언트와 서버 간의 엄격한 역할 분리를 한다. 서로의 역할을 엄격히 분리하여 서버와 클라이언트 간의 상호작용이 단순하도록 한다.<h4 id="hierarchical-system">Hierarchical System</h4>
</li>
<li>계층 구조를 가진다. 클라이언트는 리소스에 대한 직접적인 접근만 가능하며, 중간 서버는 인증, 보안, 로드 밸런싱 등의 기능을 담당한다. -&gt; 시스템의 확장성과 유연성을 높인다.<h4 id="code-on-demand">Code on demand</h4>
</li>
<li>필요에 따라 서버로부터 실행 가능한 코드를 클라이언트에게 전달할 수 있는 옵션을 제공 -&gt; 웹 브라우저에서 JavaScript 코드를 다운로드하고 실행하는 방식</li>
</ul>
<h3 id="rest-api-장점">REST API 장점</h3>
<ol>
<li>Open API 를 제공하기 쉽다</li>
<li>멀티플랫폼 지원 및 연동이 용이하다.</li>
<li>원하는 타입으로 데이터를 주고 받을 수 있다.</li>
<li>기존 웹 인프라(HTTP)를 그대로 사용할 수 있다.</li>
</ol>
<h3 id="rest-api-단점">REST API 단점</h3>
<ol>
<li>사용할 수 있는 메소드가 한정적이다.</li>
<li>분산환경에는 부적합하다.</li>
<li>HTTP 통신 모델에 대해서만 지원한다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 그리디 알고리즘]]></title>
            <link>https://velog.io/@lire_eruel/TIL-%EA%B7%B8%EB%A6%AC%EB%94%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</link>
            <guid>https://velog.io/@lire_eruel/TIL-%EA%B7%B8%EB%A6%AC%EB%94%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</guid>
            <pubDate>Fri, 23 Jun 2023 06:43:12 GMT</pubDate>
            <description><![CDATA[<h1 id="그리디-알고리즘">그리디 알고리즘</h1>
<blockquote>
<p>현재 상황에서 지금 당장 좋은 것만 고르는 방법</p>
</blockquote>
<h3 id="특징">특징</h3>
<ul>
<li>매 순간 가장 좋아 보이는 것을 선택</li>
<li>현재의 선택이 나중에 미칠 영향은 고려하지 않음.</li>
<li>사전에 외우고 있지 않아도 풀 수 있을 가능성이 높은 문제 유형</li>
</ul>
<h3 id="예제--거스름돈">예제 : 거스름돈</h3>
<blockquote>
<p>Q : 카운터에 거스름돈으로 500, 100, 50, 10원짜리 동전이 무한이 있다. 손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러줘야 할 동전의 최소 개수를 구하라. 단 거술러 줘야할 돈 N은 항상 10의 배수이다.</p>
</blockquote>
<p>해설)
이 문제는 그리디 알고리즘을 이용해 풀 수 있는 대표적인 문제이다. 바로 &#39;가장 큰 화폐 단위부터&#39; 돈을 거슬러 주는 것.</p>
<h2 id="그리디-알고리즘의-정당성">그리디 알고리즘의 정당성</h2>
<p>그리디 알고리즘을 모든 알고리즘 문제에 적용할 수 있는 것은 아니다. 대부분은 그리디로 &#39;최적의 해&#39;를 구할 수 없기 때문. </p>
<p>➡️ 따라서 그리디 알고리즘으로 문제의 해법을 찾았다면 정당한지 검토 필요.</p>
<p>위의 방법이 정당한 이유는 가지고 있는 동전 중에서 큰 단위가 항상 작은 단위의 배수이므로 작은 단위의 동전들을 조합해 다른 해가 나올 수 없기 때문이다. 예를 들어 단위가 500, 400, 100 이라면 그리디로는 4개의 동전 (500 + 100 + 100+ 100)이지만 최적해는 2개(400 + 400)이기 때문.</p>
<p>이처럼 그리디 알고리즘으로 풀었다면 정당한지 확인 가능</p>
<h2 id="코딩테스트에-응용">코딩테스트에 응용</h2>
<p>코딩테스트 문제를 만났을 때 바로 문제 유형을 파악하기 어렵다면, 그리디 알고리즘을 의심하고, 문제를 해 결할 수 있는 해결법이 존재하는지 고민하자. 만약 그리디로 안된다면 나중에 만날 DP나 그래프로 해결할지 고민해보자.</p>
<hr>
<p>그리디 알고리즘을 그냥 풀다가 책을 읽고 예제도 풀어보니 무엇인지 확실히 감이 잡힌다.
책 구매는 잘한 선택 같다! 굳</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[한국인이라면 당신도 가능하다. Next.js 오픈소스 기여! (자리 얼마 안남음)]]></title>
            <link>https://velog.io/@lire_eruel/%ED%95%9C%EA%B5%AD%EC%9D%B8%EC%9D%B4%EB%9D%BC%EB%A9%B4-%EB%8B%B9%EC%8B%A0%EB%8F%84-%EA%B0%80%EB%8A%A5%ED%95%98%EB%8B%A4.-Next.js-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EA%B8%B0%EC%97%AC-%EC%9E%90%EB%A6%AC-%EC%96%BC%EB%A7%88-%EC%95%88%EB%82%A8%EC%9D%8C</link>
            <guid>https://velog.io/@lire_eruel/%ED%95%9C%EA%B5%AD%EC%9D%B8%EC%9D%B4%EB%9D%BC%EB%A9%B4-%EB%8B%B9%EC%8B%A0%EB%8F%84-%EA%B0%80%EB%8A%A5%ED%95%98%EB%8B%A4.-Next.js-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-%EA%B8%B0%EC%97%AC-%EC%9E%90%EB%A6%AC-%EC%96%BC%EB%A7%88-%EC%95%88%EB%82%A8%EC%9D%8C</guid>
            <pubDate>Fri, 23 Jun 2023 03:14:14 GMT</pubDate>
            <description><![CDATA[<p>Next.js Docs를 한국어로 번역할 사람들을 찾는다는 소식에 헐레벌떡 뛰어갔다.</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/e1fc9ab6-f483-41d9-9e0c-c68800cbe6be/image.png" alt=""></p>
<p>한국어만 할 줄 알면 나도 이제 오픈소스 기여를 해봤다고 할 수 있다니...! 이거 참을 수 있으면 그 사람 개발자 아님.</p>
<h3 id="그렇다면-바로-시작합시다">그렇다면, 바로 시작합시다!</h3>
<h2 id="1-해당-깃허브-페이지로-접속합니다">1. 해당 <a href="https://github.com/Nextjs-kr/Nextjs.kr/issues/1">깃허브 페이지</a>로 접속합니다.</h2>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/76daa315-6f4e-4367-9f59-87b39de653ae/image.png" alt=""></p>
<p>적혀있는 것처럼 Readme와 Guide Line을 정독해줍니다. </p>
<p>Vecel Discussions에 들어가서 감정 표현도 마구 눌러주구요!</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/93de2cd3-0394-4352-849a-8000c432a469/image.png" alt=""></p>
<p>저는 이미 다 눌렀습니다.</p>
<h2 id="2-빈-자리-확인하기">2. 빈 자리 확인하기.</h2>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/9395c7ad-caf8-4523-83fb-e07a8040fad6/image.png" alt=""></p>
<p>스크롤을 내리면 이런 식으로 콘텐츠들을 볼 수 있습니다.
파란색으로 되어있는 것은 이미 자리가 차 버린 것이고, 
<img src="https://velog.velcdn.com/images/lire_eruel/post/d9af329b-bc17-4f55-95d9-f085c618f40c/image.png" alt=""></p>
<p>아래쪽에 보면 dist.Dir.mdx 처럼 아직 배정받지 않은 문서를 확인할 수 있습니다. </p>
<p>이걸 하기로 마음먹었다면</p>
<p>다시 스크롤을 점점 올리면서 경로를 메모장에 따로 적어둡시다. 예를 들면 위의 distDir.mdx와 같은 경우아래와 같습니다.</p>
<blockquote>
<p>02-app - 02-api-reference - 05-next-config-js - distDir.mdx</p>
</blockquote>
<p>스크롤을 쭉 내리면 사람들의 신청이 있을 텐데 </p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/31bf7fa5-c223-4486-8c89-e62b591470a3/image.png" alt=""></p>
<p><del>이건 제 신청 ㅎㅎ</del></p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/2b6640c3-6742-416d-926e-3926ba137f02/image.png" alt=""></p>
<p>이 로켓 표시가 없다면 아직 위쪽의 진행사항에 안된거니까, 로켓 표시 없는 코멘트들은 혹시 나와 중복되었는지 확인해보고 없다면 </p>
<p>맨 밑에 코멘트로 아까 미리 적어둔 경로 붙여놓고 신청을 하면 됩니다</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/cfad874a-c378-48a2-a845-d329de4df845/image.png" alt=""></p>
<p>이 하드같은 곳에 파란 불이 들어오면 냉큼 들어가서 로켓 이모지가 달린지 확인하고, 달렸다면 작업을 시작합시다!</p>
<h2 id="3-작업-시작하기">3. 작업 시작하기</h2>
<p>로켓 이모지가 달렸다면 본인이 담당자인 이슈도 하나 만들어져 있을 겁니다. 
작업을 시작할 때 밑에 댓글로 시작했습니다! 를 달아줍니다.</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/7d06b546-fc3a-442d-99c0-afc39f427b47/image.png" alt=""></p>
<h3 id="프로젝트-fork-하기">프로젝트 Fork 하기</h3>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/cdcebed5-fa21-4327-8ee3-3e67f7f0ff42/image.png" alt=""></p>
<p>저기 Fork를 눌러서 프로젝트를 생성해줍니다. 그럼 본인의 레포지토리로 가면 똑같이 생긴 레포가 있을텐데 이걸 Fork 라고 합니다. ㅎㅎ</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/cfc0f52c-e0ea-45c9-991d-9654725b525a/image.png" alt=""></p>
<p>프로젝트 복제라고 생각하면 됩니다!</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/5452b4c8-6335-4b9c-94f9-a8d831aa92cd/image.png" alt=""></p>
<p>본인 레포에서 git clone을 해줍니다. </p>
<h3 id="vscode를-실행해줍니다">VSCode를 실행해줍니다.</h3>
<blockquote>
<p>vscode를 실행하면 이거저거 많이 설치하라고 권유해주는데 전부 설치해주면 됩니다.</p>
</blockquote>
<p>우리가 번역할 문서는 docs 안에 있으니 경로를 잘 따라가줍시다. 
제가 번역한 문서의 위치는 이 곳 이네요.</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/c34b6e0e-e1fc-4a86-aed4-3e39ba3abc0b/image.png" alt=""></p>
<p>이제 번역을 하면 되는데, 아까 VSCODE의 추천 설치들을 다 설치했다면, 우측 상단에 돋보기 아이콘이 있을 겁니다. 클릭해주세요! 
<img src="https://velog.velcdn.com/images/lire_eruel/post/d7f9d9e2-1c15-4395-9ebc-64f39728ef4e/image.png" alt=""></p>
<p>클릭하면 mdx 파일의 preview가 나옵니다.</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/8ee63878-4c20-4100-b055-bbec62826173/image.png" alt=""></p>
<p>이제 아까 읽었던 가이드라인에 맞게 잘 번역을 해주면 됩니다. </p>
<p>이 개념을 내 마음대로 잘 설명한다기 보다는 영어를 한국어로 그대로 옮기는 것에 초점을 맞추는게 중요합니다.</p>
<p>mdx파일을 수정하다보며면, preview에 뭔가 오류가 뜨면서 이상해지는데 저장을 하면 다시 잘 보입니다.</p>
<p><del>저도  mdx파일은 처음이라 이유는 잘 모르겠네요. ㅎㅎ....</del></p>
<p>번역이 완료되었다면 commit과 push까지 해줍니다.</p>
<h3 id="pr하기">PR하기</h3>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/53d47b7d-ccc2-4703-81e3-3336560fac2d/image.png" alt=""></p>
<p>여기서 Pull requests 를 클릭해줍시다.</p>
<p><img src="blob:https://velog.io/7b25a6e8-81bb-4545-bc1b-3d06c769b42d" alt="업로드중.."></p>
<p>클릭! </p>
<p>Progress가 적혀있는데 하나씩 따라가봅시다. 
<img src="https://velog.velcdn.com/images/lire_eruel/post/8959b83f-fe7d-4a5f-8964-02a0e87e31e9/image.png" alt=""></p>
<blockquote>
<p>progress에 원래 [ ] 로 체크박스가 있을텐데 [x]로 바꾸면 체크박스로 바뀝니다.</p>
</blockquote>
<h3 id="pnpm-prettier-fix">pnpm prettier-fix</h3>
<p>터미널에 <code>pnpm prettier-fix</code>를 입력해줍니다.</p>
<p>사실 저는 저렇게 하면 모들 파일이 다 뒤집어엎어져서 제가 작성한 파일만 prettier를 적용했습니다.</p>
<p><code>pnpm prettier --write 경로</code>로 하면 됩니다. </p>
<p><code>pnpm prettier --write docs/02-app/02-api-reference/02-file-conventions/not-found.mdx</code></p>
<h3 id="번역-초안-작성">번역 초안 작성</h3>
<p>처음 번역 했던것이 잘 되었는지 어색하진 않은지 다시 점검해보고 이상하면 수정해줍시다.
수정을 했다면 위의 prettier도 다시 한번 해줍시다.</p>
<p>수정이 끝났다면 체크!</p>
<h3 id="그-밖의-다른-것들-체크">그 밖의 다른 것들 체크</h3>
<p>그 밖에 공통 스타일 가이드, 모범사례 확인 등등을 체크해줍시다. 수정사항이 있다면 prettier도 한번 더 해주세요.</p>
<p>리뷰는 다른 분이 오셔서 해주니까 체크를 풀어주세요.
다른 분이 오셔서 리뷰 해주시면 그거 반영하면 됩니다.
리뷰 반영은 스크린샷을 깜빡했네요. ㅎㅎ</p>
<h2 id="pr-열기">PR 열기!</h2>
<p>PR을 열고 나면 리뷰가 곧 달릴거에요. 리뷰를 받는다면 리뷰 반영 후 위에 리뷰 반영에 체크한 후 기다려봅시다.</p>
<p>저도 아직 Merge 대기중이라, Merge 되면 추가하겠습니다! </p>
<hr>
<p>다들 어서 막차타세요!
티켓 몇장 안남았습니다. :)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[후련한 SSAFY 10기 탈락 ( 이었던 추가 합격) 후기]]></title>
            <link>https://velog.io/@lire_eruel/%ED%9B%84%EB%A0%A8%ED%95%9C-SSAFY-10%EA%B8%B0-%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@lire_eruel/%ED%9B%84%EB%A0%A8%ED%95%9C-SSAFY-10%EA%B8%B0-%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Thu, 22 Jun 2023 02:12:01 GMT</pubDate>
            <description><![CDATA[<h2 id="지원-동기">지원 동기</h2>
<p>NCSOFT 계약직이 종료되고 실업급여를 받으면서 취업준비를 하고 있었다. 집에 혼자 있는게 답답하기도 하고 사실 시간도 허투루 쓰는 듯 하여 사람들과 함께 성장하고자 지원하게 되었다.</p>
<h2 id="에세이-작성">에세이 작성</h2>
<p>나는 사실 1년 조금 넘는 경력이 있기 때문에 이 부분을 살려 다른 동기들에게 선한 영향력을 끼치겠다는 장점을 부각했다. 그리고 교육기관이기 때문에 내 부족한 부분인 알고리즘 실력과 빈약한 포트폴리오를 ssafy에서 채우겠다는 느낌으로 작성했다. </p>
<h2 id="코딩테스트">코딩테스트</h2>
<p>내 인생에서 코딩테스트에 합격한 적이 없었다... 
난 진짜 알고리즘을 잘 못하니까, (준비를 안한게 맞다)
그래도 D2<del>D3 수준으로 나온다고 하여 그에 맞춰 D3</del>D4 수준의 문제를 2-3문제씩 풀면서 준비했고, 1솔로 합격했다! </p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/a42e7b6e-ddea-4e78-ac21-a5f592551dea/image.png" alt=""></p>
<h2 id="면접-준비">면접 준비</h2>
<p>지인들과 함께 면접 스터디를 했다. 
서로 질문해주고 뉴스 스크랩해서 PT 준비도 진행했다.</p>
<p>우리가 PT 면접 준비한 방법은 예를 들어 주제가 층간 소음이라면 </p>
<ol>
<li>chat gpt를 활용해서 층간소음 문제 정리, 해결 방법 등을 A4 2장 분량으로 문서 생성</li>
<li>생성된 문서를 각자 보고 15분 동안 각자 종이에 작성</li>
<li>돌아가면서 발표</li>
</ol>
<p>이런식으로 했는데 실전에도 아주 도움이 되었다.</p>
<h2 id="면접-후기">면접 후기</h2>
<p>이 때 우리가 준비한 PT 주제중 하나가 내 실전 PT 주제로 나와서 정말 기뻤다!</p>
<p>사실 나는 면접을 잘 봤다고 생각했다...
나는 원래도 면접에 익숙하고 잘 하는 편이기도 해서 더 그랬다. </p>
<p>이번에도 내가 잘 아는 분야가 PT 주제로 나왔어서 더 자신있었다.</p>
<p>인성면접도 예상한 질문들이 100%였어서 준비한대로 잘 말했다. </p>
<h2 id="후기">후기</h2>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/15125761-de28-4456-b773-b5eaa21d9773/image.png" alt=""></p>
<p>결과는 탈락했다. </p>
<p>자만한 것일 수도 있지만... 주위 사람들도 내 스펙은 싸피에 가기에 아깝다고 그냥 취업을 하라는 얘기가 많았다. 
면접관도 그렇게 생각해서 그냥 취업을 하라는 의미로 불합을 줬을 수도 있겠다는 생각이 든다. </p>
<p>그냥 부족해서 그렇다고 해도 그냥 이렇게 생각하는게 마음이 편하니까. ㅎㅎ</p>
<p>싸피만 바라본 한달은 희망에 젖어 마냥 행복했던 것 같다. 하지만 이제 싸피는 물건너 갔으니까 취업 준비를 다시 열심히 영차영차해볼 예정이다. </p>
<h3 id="잘가-싸피-">잘가 싸피! :)</h3>
<hr>
<h2 id="추가합격">추가합격</h2>
<h3 id="추합-기대-컨트롤-실패">추합 기대 컨트롤 실패..</h3>
<p>추가합격.. 사실 알고 있었다. 하지만 주위에 기대는 안한다고 말하고 있었다. 이게 추합은 언제 될 지도 모르는 거니까... 그리고 기대하는 것은 내게 너무 가혹했다. 마음이 너무 아파서.</p>
<p>그렇지만 사람 마음이라는 것이.... 기대를 하지 않을 수가 없었다.
하루하루 커뮤니티를 들락날락 거리며 추가합격 가능성이 있는지 사례는 많은지 돌아다녔다.
사실 진심으로 추가합격만을 바랬다. 
싸피가 정말 내게 꼭 필요했으니까... 듣도보도 못한 중소기업에 가야하는 것은 너무 우울했다.
그 탓에 싸피를 포기하려는 마음이 잡히지 않아, 공부도 제대로 못하게 되어 버려 폐관수련하겠다는 의미로 평생 잘라본 적 없는 길이로 머리도 단발로 잘랐다.</p>
<p>아무리 잊으려고 발악해도 자꾸 추합을 꿈꾸는 내 마음은 조절하기 힘들었다.</p>
<h3 id="추가합격날">추가합격날</h3>
<p>본가에서 서울로 오는 기차에서 잠에 들었다 깨어났는데 부재중이 와 있었다.
혹시..? 혹시 하고 보았더니 멀티캠퍼스 사무실 전화번호였다..! </p>
<p>아니 이거 전화 못받으면 불합격인가 하고 대성통곡 하고있었는데</p>
<p>대성통곡하느라 전화를 한번 더 못받았다.</p>
<p><del>(진짜 바보인가?)</del></p>
<p>그리고 나서 또 한번 전화가 왔다.</p>
<p>이름을 확인 하시고 </p>
<blockquote>
<p>10기 추가 합격 축하드립니다!! </p>
</blockquote>
<p>라고 얘기해주셨다. 그리고 수 많은 추합 후기에서 봤던것처럼 입과 여부를 여쭤보시는 것 같길래 듣지도 않고 </p>
<blockquote>
<p>네!! 네!! 갈게요 바로 갈게요 좋아요!!!!</p>
</blockquote>
<p>라고했다. 담당자분도 웃어주셨다. ㅎㅎ
사진 제출도 바로 하라고 해주셨는데 내가 아직 기차를 타고 있어서 바로 제출은 불가해서 집에서 제출했다.</p>
<p>후련한 불합격 후기가... 추가합격 후기가 되어
진심으로 기쁘다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL]CSS 선택자 우선순위]]></title>
            <link>https://velog.io/@lire_eruel/TILCSS-%EC%84%A0%ED%83%9D%EC%9E%90-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84</link>
            <guid>https://velog.io/@lire_eruel/TILCSS-%EC%84%A0%ED%83%9D%EC%9E%90-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84</guid>
            <pubDate>Thu, 02 Mar 2023 13:03:47 GMT</pubDate>
            <description><![CDATA[<h2 id="css-선택자-우선-순위">CSS 선택자 우선 순위</h2>
<p>CSS 선택자 우선순위는 CSS 규칙의 적용 우선순위를 결정하는 방법입니다. CSS 규칙은 여러 개의 선택자와 스타일 선언으로 이루어져 있으며, 이 중 어떤 규칙이 우선적으로 적용될지는 다음과 같은 기준에 따라 결정됩니다.</p>
<ol>
<li><p>중요도 (Importance): !important 규칙은 다른 모든 규칙보다 우선합니다.</p>
</li>
<li><p>인라인 스타일 (Inline Styles): HTML 요소에 직접 적용된 스타일은 다른 모든 규칙보다 우선합니다.</p>
</li>
<li><p>아이디 선택자 (ID Selectors): ID 선택자에 의해 스타일이 적용되는 요소는 다른 모든 선택자보다 우선합니다.</p>
</li>
<li><p>클래스 선택자 (Class Selectors) 및 속성 선택자(Attribute Selectors): 클래스 선택자와 속성 선택자는 태그 선택자보다 우선합니다.</p>
</li>
<li><p>태그 선택자 (Tag Selectors): 태그 선택자에 의해 스타일이 적용되는 요소는 다른 모든 선택자보다 낮은 우선순위를 가집니다.</p>
</li>
<li><p>전체 선택자 (Universal Selector): 전체 선택자는 다른 모든 선택자보다 낮은 우선순위를 가집니다.</p>
</li>
</ol>
<p>우선순위가 같은 경우에는 나중에 선언된 규칙이 우선합니다. 따라서 같은 선택자에 대해 뒤에 나온 스타일이 우선적으로 적용됩니다.</p>
<p>위와 같은 우선순위 규칙을 이용하여 CSS를 작성하면, 스타일이 일관되고 예측 가능한 방식으로 적용됩니다. 그러나 우선순위가 높은 규칙을 남용하거나 중복되는 규칙을 작성할 경우, 코드의 복잡도가 증가하고 유지 보수성이 낮아질 수 있으므로 주의해야 합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 웹 표준과 웹 접근성]]></title>
            <link>https://velog.io/@lire_eruel/TIL-%EC%9B%B9-%ED%91%9C%EC%A4%80%EA%B3%BC-%EC%9B%B9-%EC%A0%91%EA%B7%BC%EC%84%B1</link>
            <guid>https://velog.io/@lire_eruel/TIL-%EC%9B%B9-%ED%91%9C%EC%A4%80%EA%B3%BC-%EC%9B%B9-%EC%A0%91%EA%B7%BC%EC%84%B1</guid>
            <pubDate>Thu, 02 Mar 2023 13:03:05 GMT</pubDate>
            <description><![CDATA[<h2 id="웹-표준">웹 표준</h2>
<blockquote>
<p>웹 표준(웹 스탠다드)은 월드 와이드 웹(WWW)에서 사용되는 기술과 규약들의 표준화를 말합니다. 이는 HTML, CSS, JavaScript 등의 웹 기술을 표준화하여 다양한 웹 브라우저와 플랫폼에서 동일한 웹 페이지를 구현할 수 있도록 하여 웹 개발자들이 보다 쉽게 웹 사이트를 개발할 수 있도록 돕는 역할을 합니다.</p>
</blockquote>
<h3 id="웹-표준을-준수하는-방법">웹 표준을 준수하는 방법</h3>
<ol>
<li><p>DOCTYPE 선언하기: HTML 문서의 첫 번째 줄에 DOCTYPE을 선언해야 합니다. 이는 웹 브라우저가 문서의 버전과 유형을 파악하여 적절한 방식으로 문서를 해석할 수 있도록 합니다.</p>
</li>
<li><p>유효한 HTML과 CSS 사용하기: HTML과 CSS는 웹 표준을 따르는 방식으로 작성되어야 합니다. 이는 웹 브라우저에서 문서를 올바르게 해석할 수 있도록 하는 것입니다.</p>
</li>
<li><p>웹 페이지의 구조와 스타일을 분리하기: HTML 문서에서는 구조를, CSS에서는 스타일을 담당하도록 분리하여 작성해야 합니다. 이는 유지 보수성을 높이고, 코드 가독성을 높이며, 웹 사이트의 디자인을 보다 쉽게 변경할 수 있도록 합니다.</p>
</li>
<li><p>적절한 이미지 대체 텍스트 제공하기: 이미지가 있는 경우에는 alt 속성을 이용하여 적절한 대체 텍스트를 제공해야 합니다. 이는 시각 장애를 가진 사용자들이 이미지를 이해할 수 있도록 하는 것입니다.</p>
</li>
<li><p>웹 접근성 고려하기: 웹 표준을 준수하면서 웹 접근성을 고려하여 웹 사이트를 제작해야 합니다. 이는 장애를 가진 사용자들이 웹 사이트에 쉽게 접근할 수 있도록 하는 것입니다.</p>
</li>
<li><p>웹 사이트의 성능 최적화하기: 웹 표준을 준수하면서 웹 사이트의 성능을 최적화해야 합니다. 이는 빠른 로딩 속도와 높은 사용성을 보장하는 것입니다.</p>
</li>
</ol>
<h2 id="웹-접근성">웹 접근성</h2>
<blockquote>
<p>웹 접근성은 장애를 가진 사용자들이 웹 사이트에 쉽게 접근할 수 있도록 웹 사이트를 설계하는 것을 말합니다. 예를 들어 시각 장애를 가진 사용자들은 음성 출력, 화면 돋보기 등의 보조 기술을 사용하여 웹 사이트에 접근합니다. 이를 위해서는 웹 사이트의 콘텐츠, 기능, 디자인 등이 웹 접근성을 고려하여 제작되어야 합니다.</p>
</blockquote>
<p>웹 표준과 웹 접근성은 서로 밀접한 관련이 있습니다. 웹 표준을 준수하면 웹 사이트가 다양한 플랫폼과 웹 브라우저에서 일관되게 보여지므로 사용자들이 쉽게 접근할 수 있습니다. 또한 웹 접근성을 고려한 웹 사이트는 장애를 가진 사용자들이 더 쉽게 접근할 수 있도록 구성되어 있으므로 웹 접근성이 높은 웹 사이트는 모든 사용자에게 유용합니다. 따라서 웹 사이트를 개발할 때는 웹 표준을 준수하고 웹 접근성을 고려하여 개발해야 합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] CSS에서 사용되는 단위의 종류와 특징]]></title>
            <link>https://velog.io/@lire_eruel/TIL-CSS%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94-%EB%8B%A8%EC%9C%84%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%A7%95</link>
            <guid>https://velog.io/@lire_eruel/TIL-CSS%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94-%EB%8B%A8%EC%9C%84%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%A7%95</guid>
            <pubDate>Mon, 27 Feb 2023 13:06:11 GMT</pubDate>
            <description><![CDATA[<h2 id="css에서-사용되는-단위">CSS에서 사용되는 단위</h2>
<h3 id="px">px</h3>
<pre><code>- 화면의 크기와 무관하게 픽셀 단위로 지정
- 정확한 크기를 표현할 때 사용</code></pre><h3 id="vh-vw">vh, vw</h3>
<pre><code>- 뷰포트의 크기를 기준으로 상대적인 크기를 지정
- 레이아웃을 유동적으로 유지할 때 유용하다.</code></pre><h3 id="">%</h3>
<pre><code>- 부모 요소의 크기에 따라 크기가 결정
- 반응형 레이아웃에서 많이 사용</code></pre><h3 id="rem-em">rem, em</h3>
<pre><code>- 폰트 크기를 지정할 때 사용
- rem은 루트 요소의 폰트 크기에 영향을 받음.
- em은 상위 요소의 폰트 크기에 영향을 받음.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] 인터뷰 정리 - React, 렌더링 기법, SEO, CORS, 세션과 쿠키, 프록시 서버]]></title>
            <link>https://velog.io/@lire_eruel/TIL-%EC%9D%B8%ED%84%B0%EB%B7%B0-%EC%A0%95%EB%A6%AC-React-%EB%A0%8C%EB%8D%94%EB%A7%81-%EA%B8%B0%EB%B2%95-SEO-CORS-%EC%84%B8%EC%85%98%EA%B3%BC-%EC%BF%A0%ED%82%A4-%ED%94%84%EB%A1%9D%EC%8B%9C-%EC%84%9C%EB%B2%84</link>
            <guid>https://velog.io/@lire_eruel/TIL-%EC%9D%B8%ED%84%B0%EB%B7%B0-%EC%A0%95%EB%A6%AC-React-%EB%A0%8C%EB%8D%94%EB%A7%81-%EA%B8%B0%EB%B2%95-SEO-CORS-%EC%84%B8%EC%85%98%EA%B3%BC-%EC%BF%A0%ED%82%A4-%ED%94%84%EB%A1%9D%EC%8B%9C-%EC%84%9C%EB%B2%84</guid>
            <pubDate>Fri, 24 Feb 2023 14:53:18 GMT</pubDate>
            <description><![CDATA[<h1 id="react">React</h1>
<h2 id="상태와-속성">상태와 속성</h2>
<h3 id="상태state">상태(state)</h3>
<p>상태란 컴포넌트 내부에서 변경 가능한 데이터를 의미합니다. 상태는 컴포넌트 내에서 변경되며, 이에 따라 컴포넌트가 다시 렌더링됩니다. React에서 상태는 클래스형 컴포넌트나 함수형 컴포넌트에서 uesEffect 훅을 사용하여 관리할 수 있습니다. </p>
<h3 id="속성-prop">속성 (prop)</h3>
<p>속성(prop)이란 컴포넌트에 전잘되는 읽기 전용 데이터를 의미합니다. 속성은 부모 컴포넌트에서 자식 컴포넌트로 전달되며, 컴포넌트 내에서 변경할 수 없습니다. 속성을 통해 부모 컴포넌트에서 데이터를 전달받아 사용할 수 있습니다. </p>
<p><strong>상태와 속성을 잘 활용하여 React App을 개발하면, 유지보수성이 높고 코드의 가독성도 좋아집니다.</strong></p>
<h2 id="라이프사이클-메서드--lifecycle-methods">라이프사이클 메서드  (lifecycle methods)</h2>
<p>React에서 라이프사이클 메서드(lifecycle methods)는 컴포넌트의 생성, 업데이트, 제거와 관련된 이벤트에 대해 처리하는 메서드입니다. React 16 이전까지는 클래스형 컴포넌트에서만 사용할 수 있었지만, 16 이후부터는 함수형 컴포넌트에서도 사용이 가능해졌습니다.</p>
<p>React에서는 컴포넌트가 생성되고, 업데이트되며, 제거될 때 다양한 라이프사이클 메서드를 호출합니다. 이를 통해 컴포넌트가 마운트, 언마운트, 업데이트되는 동안 원하는 작업을 수행할 수</p>
<p>있습니다.</p>
<p>React의 라이프사이클 메서드는 크게 3가지 카테고리로 나눌 수 있습니다.</p>
<p><strong>마운트(Mounting)</strong> : 컴포넌트가 처음으로 생성되어 DOM에 삽입되는 것</p>
<p><strong>업데이트(Updating)</strong> : 컴포넌트가 업데이트 되는 것</p>
<p><strong>언마운트(Unmounting)</strong> : 컴포넌트가 DOM에서 제거되는 것</p>
<blockquote>
<p>React 16 이전의 클래스형 컴포넌트에서는 라이프사이클 메서드를 사용하여 위 세 가지 단계에서 원하는 작업을 수행할 수 있었습니다. 하지만 React 16 이후의 함수형 컴포넌트에서는 라이프사이클 메서드 대신에, useEffect 훅을 사용하여 원하는 작업을 수행할 수 있습니다.</p>
</blockquote>
<p>React에서 라이프사이클 메서드를 사용할 때는, 컴포넌트의 상태와 속성에 대한 이해가 필요합니다. 라이프사이클 메서드를 적절히 활용하여, 컴포넌트의 마운트, 업데이트, 언마운트에 대한 동작을 제어할 수 있습니다. 그러나 최근에는 함수형 컴포넌트와 훅의 등장으로 라이프사이클 메서드를 사용하지 않고도 컴포넌트의 동작을 제어할 수 있게 되었습니다. 따라서, <strong>최신 React에서는 라이프사이클 메서드 대신에 useEffect 훅을 사용하는 것을 권장합니다.</strong></p>
<h1 id="렌더링-기법">렌더링 기법</h1>
<h2 id="spa-single-page-application">SPA (Single Page Application)</h2>
<p>SPA는 한 개의 HTML 파일을 사용하고, 페이지의 일부분만을 변경하는 방식으로 동작합니다.
클라이언트 측에서 렌더링이 이루어지므로 서버 부담이 적습니다.
사용자 경험이 좋고, 빠른 속도를 제공할 수 있습니다.
초기 로딩 시간이 길고, SEO에 좋지 않을 수 있습니다.</p>
<h2 id="csr-client-side-rendering">CSR (Client Side Rendering)</h2>
<p>CSR은 SPA의 한 종류로, 서버에서 제공되는 데이터를 받아와 클라이언트 측에서 렌더링을 수행하는 방식입니다.
초기 로딩 시간이 짧고, SPA처럼 빠른 속도를 제공할 수 있습니다.
SEO 문제와 초기 로딩 속도가 느릴 수 있는 단점이 있습니다.</p>
<h2 id="ssr-server-side-rendering">SSR (Server Side Rendering)</h2>
<p>SSR은 서버 측에서 HTML 파일을 생성하여 클라이언트에 전달하는 방식으로 동작합니다.
초기 로딩 시간이 빠르고, SEO에 우수합니다.
서버 부하가 높을 수 있으며, 전체적인 사용자 경험이 떨어질 수 있습니다.
초기 구성 비용이 높을 수 있습니다.</p>
<h2 id="seosearch-engine-optimization">SEO(Search Engine Optimization)</h2>
<p>검색 엔진 최적화를 의미합니다. 즉, 검색 엔진에서 웹 페이지를 검색하여 순위를 매기는 방식에서 높은 순위를 얻을 수 있도록 웹 사이트를 최적화하는 기술이나 작업을 말합니다.</p>
<p>검색 엔진에서 사용자가 검색한 단어 또는 구를 검색해서 최적의 검색 결과를 보여주는데, 이 때 검색어와 관련된 웹 페이지를 높은 순위로 보여주는 것이 SEO의 목적입니다. 이를 위해서는 검색 엔진이 사용하는 알고리즘에 맞는 웹 페이지를 만들고, 검색 엔진이 크롤링하기 쉬운 웹 페이지를 만들어야 합니다. 이를 위해 HTML 태그, 제목, 내용, 이미지, URL, 링크 등에 키워드를 적절히 활용하고, 검색 엔진에서 웹 페이지를 검색하면 빠르게 로딩되는 웹 페이지를 제공하도록 개발합니다.</p>
<h3 id="seo-개선-방법">SEO 개선 방법</h3>
<ul>
<li>적절한 키워드 사용<ul>
<li>검색어를 찾아서 웹 페이지의 콘텐츠와 HTML 태그에서 적절한 위치에 삽입합니다.</li>
</ul>
</li>
<li>고품질 콘텐츠 작성<ul>
<li>사용자에게 유용한 정보를 제공하고, 키워드를 적절하게 사용하면서, 인공적인 키워드 채우기를 하지 않습 니다.</li>
</ul>
</li>
<li>웹 페이지의 속도 향상<ul>
<li>웹 페이지의 로딩 속도가 빠르면 검색 엔진에서 높은 순위를 얻을 수 있습니다. 이미지 크기를 줄이고, HTML/CSS/JavaScript 파일을 압축하고, CDN을 사용하여 속도를 향상시킵니다.</li>
</ul>
</li>
<li>모바일 최적화<ul>
<li>모바일 장치에서도 웹 페이지가 잘 작동하도록 개발하고, 모바일 최적화된 디자인을 적용합니다.</li>
</ul>
</li>
<li>링크 구조 개선 <ul>
<li>내부 링크 구조를 개선하여 검색 엔진이 페이지를 쉽게 탐색할 수 있도록 합니다.</li>
</ul>
</li>
<li>메타 데이터 최적화<ul>
<li>메타 데이터(타이틀, 설명 등)를 적절하게 작성하여 검색 결과에서 노출되도록 합니다.</li>
</ul>
</li>
</ul>
<h2 id="세션과-쿠키">세션과 쿠키</h2>
<h3 id="세션session이란">세션(Session)이란?</h3>
<ul>
<li>세션은 서버에서 클라이언트를 구분하고 클라이언트의 상태를 유지하는 기술입니다.</li>
<li>세션은 클라이언트가 서버에 접속한 이후 브라우저를 닫거나 일정 시간이 지난 후에도 서버에서 클라이언트의 정보를 유지할 수 있습니다.</li>
<li>세션은 보안 측면에서 중요합니다. 서버에서 세션 ID를 발급하고, 클라이언트는 이 세션 ID를 쿠키로 저장하여 서버와 통신합니다. 이를 통해 서버는 세션 ID를 확인하여 유효한 클라이언트인지 판단할 수 있습니다.</li>
</ul>
<h3 id="쿠키cookie란">쿠키(Cookie)란?</h3>
<ul>
<li>쿠키는 클라이언트 측에서 저장되는 작은 데이터 파일입니다.</li>
<li>쿠키는 사용자 인증, 세션 유지, 개인화 등 다양한 목적으로 사용됩니다.</li>
<li>쿠키는 이름, 값, 만료 날짜 및 경로 정보 등을 가집니다.</li>
<li>쿠키는 브라우저에서 관리되며, 만료 날짜가 지나면 자동으로 삭제됩니다.</li>
<li>쿠키는 서버에서 응답 헤더를 통해 클라이언트에게 전송되며, 클라이언트에서는 요청 헤더를 통해 쿠키를 서버에 전송합니다.</li>
</ul>
<h2 id="corscross-origin-resource-sharing">CORS(Cross-Origin Resource Sharing)</h2>
<p>CORS(Cross-Origin Resource Sharing)는 웹 개발에서 발생하는 보안 이슈 중 하나입니다. 보안 상의 이유로, 브라우저는 한 도메인에서 실행되는 웹 페이지가 다른 도메인에 있는 리소스에 접근하는 것을 제한합니다.</p>
<p>CORS는 이러한 보안 이슈를 해결하기 위한 기술 중 하나입니다. CORS를 사용하면, 웹 페이지에서 다른 도메인의 리소스에 접근할 수 있습니다. 이를 위해 서버에서는 특정 HTTP 헤더를 설정하여, 클라이언트가 다른 도메인의 리소스에 접근할 수 있도록 허용합니다. 브라우저는 이러한 헤더를 확인하고, 해당 리소스에 대한 접근 권한이 있는지 확인합니다. 이를 통해, 서로 다른 도메인 간에도 안전하게 리소스를 공유할 수 있습니다.</p>
<p>CORS는 웹 개발에서 매우 중요한 보안 이슈이며, 개발자는 서버에서 CORS 설정을 올바르게 구성하여, 다른 도메인의 리소스에 대한 접근을 안전하게 허용해야 합니다.</p>
<h2 id="cors를-해결하는-방법">CORS를 해결하는 방법</h2>
<p>CORS를 해결하는 방법은 크게 두 가지로 나눌 수 있습니다.</p>
<p>첫 번째 방법은 <strong>서버 측에서 CORS를 허용하는 설정을 추가</strong>하는 것입니다. 서버에서는 Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers와 같은 헤더를 설정하여 허용된 도메인에서만 리소스에 접근이 가능하도록 허용할 수 있습니다. 이를 통해, 브라우저에서는 서버에서 설정한 도메인에서만 리소스에 접근이 가능하도록 제한됩니다.</p>
<p>두 번째 방법은 <strong>JSONP</strong>(JSON with Padding)를 사용하는 것입니다. JSONP는 AJAX 요청을 보내는 대신, 동적으로 스크립트 태그를 생성하고, JSON 데이터를 콜백 함수로 전달하는 방식으로 동작합니다. JSONP는 브라우저에서 CORS를 우회하는 방법 중 하나이며, 서버에서는 JSONP 요청을 받을 수 있도록 응답을 구성해야 합니다.</p>
<blockquote>
<p>서버에서 CORS를 허용하는 방법이 가장 일반적이며, 보안상의 이유로, JSONP는 사용하지 않는 것이 좋습니다. 따라서, 서버에서 CORS 설정을 제대로 구성하는 것이 중요합니다.</p>
</blockquote>
<h3 id="프록시를-이용하여-cors-문제를-우회하는-방법">프록시를 이용하여 CORS 문제를 우회하는 방법</h3>
<p>   프록시 서버는 클라이언트와 서버 사이에서 중계 역할을 수행하며, 클라이언트와 서버 간의 통신을 대신 처리해줍니다. 클라이언트는 프록시 서버에 요청을 보내고, 프록시 서버는 서버에서 리소스를 가져와 클라이언트에게 반환해줍니다. 이를 통해, 클라이언트는 서버의 도메인과는 직접적으로 통신하지 않기 때문에 CORS 문제를 우회할 수 있습니다.</p>
<p>프록시를 이용하여 CORS 문제를 해결하는 방법은 보안성이 높아지는 장점이 있으나, 구성하기가 복잡하며, 프록시 서버의 성능 이슈가 발생할 수도 있습니다. 따라서, 프록시를 사용하는 경우, 이러한 문제들을 고려하여 적절하게 구성하는 것이 중요합니다.</p>
<h4 id="프록시-서버">프록시 서버</h4>
<blockquote>
</blockquote>
<p>프록시 서버란, 클라이언트와 서버 사이에서 중계 역할을 수행하는 서버를 말합니다. 프록시 서버는 클라이언트가 서버에 직접적으로 접근하는 것을 막고, 클라이언트와 서버 사이의 통신을 대신 처리해줍니다. 이를 통해, 클라이언트의 IP 주소나 위치 등의 정보를 숨기거나, 웹 콘텐츠를 캐시하여 빠른 로딩을 도와주는 등의 기능을 수행할 수 있습니다.</p>
<p>프록시 서버는 일반적으로, 브라우저나 애플리케이션 설정에서 직접 설정할 수 있으며, 클라이언트는 프록시 서버에 요청을 보내고, 프록시 서버는 서버에서 리소스를 가져와 클라이언트에게 반환해줍니다. 이를 통해, 클라이언트는 서버의 도메인과는 직접적으로 통신하지 않기 때문에, 보안성이 높아질 수 있습니다.</p>
<p>프록시 서버는 클라이언트와 서버 사이에서 중개자 역할을 수행하기 때문에, 웹 보안과 성능 개선 등에 활용될 수 있으며, 프록시 서버의 종류에 따라 다양한 기능을 수행할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] HTML, CSS, JavaScript 기본 개념 정리]]></title>
            <link>https://velog.io/@lire_eruel/TIL-HTML-CSS-JavaScript-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@lire_eruel/TIL-HTML-CSS-JavaScript-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 23 Feb 2023 13:06:52 GMT</pubDate>
            <description><![CDATA[<h1 id="html">HTML</h1>
<p>HTML HyperText Markup Language의 약자로, 마크업 언어입니다. 
웹 페이지의 구조와 콘텐츠를 정의하는데 사용되며, 웹 페이지를 브라우저에서 표시할 때 사용됩니다. 
웹 페이지에 있는 텍스트, 이미지, 링크, 비디오 등의 요소를 구조화하고 레이아웃을 정의합니다. </p>
<h3 id="html5에서-추가된-새로운-기능">HTML5에서 추가된 새로운 기능</h3>
<p>HTML5에서는 여러 가지 새로운 요소와 기능이 추가되었습니다. </p>
<ul>
<li>시멘틱 요소가 추가되었습니다. 예를 들어 header,nav, article, section, footer가 있습니다.</li>
<li>비디오와 오디오 태그 video와 audio 태그를 사용하여 비디오와 오디오를 쉽게 재생할 수 있습니다.</li>
<li>폼 관련 개선 ( 새로운 폼 요소들이 추가되어, 폼 요소들의 속성과 이벤트들이 개선되었습니다. )</li>
<li>캔버스와 SVG canvas와 svg 태그를 사용하여 그래픽과 애니메이션을 만들 수 있습니다.</li>
<li>웹 저장소 (Web Storage) : 로컬 저장소와 세션 저장소를 지원합니다. 이를 이용하여 브라우저 내에서 데이터를 저장하고 사용할 수 있습니다.</li>
<li>웹 서비스를 개발 할 때 사용하는 localStorage와 sessionStorage 는 HTML5에서 지원하는 기능 중 하나인 Web Storage API의 의 일종이다.</li>
<li>웹 워커 (Web Worker) : 웹 워커를 사용하면 백그라운드에서 스크립트를 실행하여 웹 페이지의 성능을 향상시킬 수 있다.<ul>
<li>기존의 자바스크립트는 싱글 스레드로 실행되기 때문에, 여러 가지 작업을 동시에 처리하려면 비동기 처리를 해야했다. 하지만 이 비동기 처리는 복잡하고 어려운 방식이라 웹 워커가 이  처리를 쉽게 할 수 있도록 도와줍니다. <ul>
<li>메인 스레드와 별도로 동작하며, 브라우저에서 백그라운드에서 스크립트를 실행할 수 있게 한다. 웹 워커는 병렬로 작업을 처리하기 때문에 여러 개의 웹 워커를 사용하면 더 빠르게 처리할 수 있다.</li>
<li>주로 대용량의 데이터 처리나 복잡한 계산, 그리고 이미지 처리에 사용된다.</li>
</ul>
</li>
</ul>
</li>
<li>미디어 쿼리</li>
<li>웹 폰트</li>
<li>드래그 앤 드롭</li>
</ul>
<h1 id="css">CSS</h1>
<p>CSS는 Cascading Style Sheets의 약자로, 웹 페이지의 스타일을 정의하는 언어입니다.
HTML과 함께 사용되며, HTML 요소들의 스타일으 정의하는데 사용됩니다.</p>
<h3 id="css3에서-추가된-새로운-기능">CSS3에서 추가된 새로운 기능</h3>
<ul>
<li>그리드 레이아웃</li>
<li>플렉스 박스</li>
<li>다단 Drop Cap<ul>
<li>텍스트의 첫 글자를 크게 만들 어 다단의 시작 부분을 장식할 수 있습니다.</li>
</ul>
</li>
<li>그림자</li>
<li>Transform</li>
<li>새로운 셀렉터<ul>
<li>:not(), :nth-child(), :first-child()</li>
</ul>
</li>
<li>애니메이션과 트랜지션 같은 기능</li>
</ul>
<h1 id="javascript">JavaScript</h1>
<h3 id="개념">개념</h3>
<ul>
<li>객체 기반의 동적 프로그래밍 언어</li>
<li>주로 웹 페이지를 동적으로 제어하는 데에 사용</li>
<li>브라우저에서 실행되며 HTML 문서와 함께 사용하여 웹 페이지를 만들고 상호작용하는 기능을 추가할 수 있음<h3 id="특징">특징</h3>
</li>
<li>가볍고 빠름</li>
<li>동적 타이핑 (변수의 타입을 런타임 시점에 결정)</li>
<li>함수형 프로그래밍과 객체지향 프로그래밍 모두 지원</li>
</ul>
<h3 id="es6에서-추가된-내용">ES6에서 추가된 내용</h3>
<ul>
<li>let, const 키워드 추가</li>
<li>화살표 함수 (Arrow function) 추가</li>
<li>템플릿 리터럴 (Template literal) 추가</li>
<li>클래스 (Class) 추가</li>
<li>모듈 (Module) 추가</li>
<li>Async/Await 추가</li>
<li>for...of 추가</li>
<li>객체 리터럴 (Object literal) 추가</li>
</ul>
<h1 id="es6">ES6</h1>
<h3 id="개념-1">개념</h3>
<ul>
<li>ECMAScript 2015의 준말로, JavaScript의 버전 업그레이드</li>
<li>가독성이 좋고 코드의 양을 줄일 수 있는 새로운 기능들을 제공</li>
</ul>
<h3 id="주요-기능">주요 기능</h3>
<h4 id="let-const">let, const</h4>
<ul>
<li>블록 레벨 스코프 변수 선언</li>
<li>let은 재할당이 가능하고 const는 재할당이 불가능<h4 id="화살표-함수">화살표 함수</h4>
</li>
<li>함수를 간결하게 작성할 수 있음</li>
<li>this, arguments 등의 바인딩을 가지지 않음<h4 id="템플릿-리터럴">템플릿 리터럴</h4>
</li>
<li>문자열을 보다 쉽게 다룰 수 있음</li>
<li>백틱(``)으로 감싸고 ${}를 사용하여 변수나 표현식을 삽입할 수 있음<h4 id="클래스">클래스</h4>
</li>
<li>클래스 기반 객체 지향 프로그래밍 지원</li>
<li>생성자, 상속 등의 기능 제공<h4 id="모듈">모듈</h4>
</li>
<li>파일 단위로 모듈화할 수 있음</li>
<li>import, export 키워드로 모듈을 가져오거나 내보낼 수 있음<h4 id="promise-asyncawait">Promise, Async/Await</h4>
</li>
<li>비동기 처리를 더욱 쉽게 작성할 수 있음<h4 id="forof">for...of</h4>
</li>
<li>for...in과 달리, 배열 등의 컬렉션 객체에 대한 반복문에서 요소의 값을 반환할 수 있음<h4 id="객체-리터럴">객체 리터럴</h4>
</li>
<li>객체를 보다 쉽게 작성할 수 있음</li>
<li>변수를 속성 이름으로 사용 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] Vue 2와 Vue 3의 차이]]></title>
            <link>https://velog.io/@lire_eruel/TIL-Vue-2%EC%99%80-Vue-3%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@lire_eruel/TIL-Vue-2%EC%99%80-Vue-3%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Tue, 18 Oct 2022 14:26:50 GMT</pubDate>
            <description><![CDATA[<p>오늘은 Vue 2와 Vue 3의 차이가 모르는 나를 위해 알아보도록 하겠다.</p>
<hr>
<p>가장 큰 차이는 Vue 2는 Options API를 사용하고 Vue 3은 Composition API를 사용한다.</p>
<p>세부적인 내용은 시작해 보자!</p>
<h2 id="creating-app의-차이">Creating App의 차이</h2>
<blockquote>
<p><strong>Vue2</strong>와** Vue3**은 앱을 만들 때부터 차이가 있다.</p>
</blockquote>
<p>** Vue2**</p>
<pre><code class="language-js">import Vue from &#39;vue&#39;
import App from &#39;./App.vue&#39;

Vue.config.productionTip = false

new Vue({
  render: h =&gt; h(App),
}).$mount(&#39;#app&#39;)</code></pre>
<p>** Vue3**</p>
<pre><code class="language-js">import { createApp } from &#39;vue&#39;
import App from &#39;./App.vue&#39;
import &#39;./index.css&#39;

createApp(App).mount(&#39;#app&#39;)</code></pre>
<h2 id="multiple-root">Multiple Root</h2>
<blockquote>
<p>** Vue2<strong>에서는 template 안에 root node가 하나만 있어야 했다.
** Vue3</strong>에서는 전혀 상관 없다.</p>
</blockquote>
<p>** Vue2**</p>
<pre><code class="language-Vue">&lt;template&gt;
    &lt;div&gt;
        &lt;p&gt;모야호&lt;/p&gt;
        &lt;button&gt;먕&lt;/button&gt;
    &lt;/div&gt;
&lt;/template&gt;</code></pre>
<p>** Vue3**</p>
<pre><code class="language-Vue">&lt;template&gt;
    &lt;p&gt;모야호&lt;/p&gt;
    &lt;button&gt;먕&lt;/button&gt;
&lt;/template&gt;</code></pre>
<p>차이가 느껴지나? root node를 하나로 제한하기 위해 쓸데없이 태그 하나로 감쌀 필요가 사라졌다!
약간 스벨트가 생각이 난다</p>
<h2 id="computed를-사용하는-방법의-차이">Computed를 사용하는 방법의 차이</h2>
<blockquote>
<p>** Vue2<strong>에서는 computed 블록 안에 계산될 값들을 넣어야 했다.
** Vue3</strong>에서는 setup()안에서 변수 선언시 computed(() =&gt; {return _}); 형식으로 사용이 가능하다.</p>
</blockquote>
<h2 id="watch를-사용하는-방법의-차이">Watch를 사용하는 방법의 차이</h2>
<p>watch는 특정 값을 바라보다 변경이 발생하면 호출된다. 대부분의 경우 computed 속성을 사용하는 것이 더 적절하다. 하지만 데이터 변경에 의한 응답으로 비동기 혹은 비용이 많이 드는 작업을 하려고 할 때 watch가 유용하다.</p>
<p>** Vue2**</p>
<pre><code class="language-js">watch : {
    name(newVal, oldVal){
        console.log(`${newVal} ${oldVal}`);    
    }
}</code></pre>
<p>** Vue3**</p>
<pre><code class="language-js">const name = ref(&#39;&#39;);
watchEffect(() =&gt; {
    console.log(name.value);
})</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[게임회사 출근 2일차 후기]]></title>
            <link>https://velog.io/@lire_eruel/%EA%B2%8C%EC%9E%84%ED%9A%8C%EC%82%AC-%EC%B6%9C%EA%B7%BC-2%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@lire_eruel/%EA%B2%8C%EC%9E%84%ED%9A%8C%EC%82%AC-%EC%B6%9C%EA%B7%BC-2%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 18 Oct 2022 14:09:50 GMT</pubDate>
            <description><![CDATA[<p>게임 회사 일기를 써보려고 한다.
평생 가보고 싶었던 게임 회사에서 3개월간 일할 수 있게 되었는데 그것도 국내에서 제일 큰 기업중 하나에 다니니 이런 소중한 3개월을 잊지않고 소중히 여기고 싶다. </p>
<p>혹시 읽어볼 분들을 위해 소개를 하자면, 저는 게임회사 내부 연구실 소속에 단기계약직으로 입사를 하였습니다. 아르바이트/인턴/계약직/정규직과 다른 점 미리 알아주세요! ㅎㅎ</p>
<hr>
<h2 id="난-앞으로-밥-안주는-회사-안가">난 앞으로 밥 안주는 회사 안가.</h2>
<img src=https://velog.velcdn.com/images/lire_eruel/post/515d56d3-e19e-46e7-8091-698e0107dd40/image.jpg width="30%" alt="점심 밥 사진">
<img src=https://velog.velcdn.com/images/lire_eruel/post/fccebcdf-80a9-4eae-a3f4-dd9528b1ccac/image.jpg width="30%" alt="저녁 밥 사진">

<p>회사에서 지금까지 총 4끼를 먹어봤는데 싫어하던 음식도 좋아하게되었다.
나는 사실 돈까스를 싫어하는데 어제 구내식당 돈까스를 먹어보고 이제 돈까스를 좋아하게 되었다...</p>
<blockquote>
<p>정말 모든 음식이 너무 맛있는데 선택지도 많고 가격도 저렴해서 진짜 행복하다.</p>
</blockquote>
<p>개발자 회고인데 밥 얘기 부터 나와서 당황스러울 수 있지만....
전직장에서 밥으로 서러운 일이 너무 많았기 때문에 밥을 잘 챙겨주는 회사가 이렇게 고마울 데가 없다.</p>
<p>이제 눈이 높아져서 구내식당이 있거나 식비를 주는 회사만 지원할 것 같다.
구내식당은 정말 최고야! </p>
<h2 id="점심시간에-게임을-해도-된다구요">점심시간에 게임을 해도 된다구요....?</h2>
<p>다음주에 워크샵이 있어서 워크샵 게임대회 예선전이 점심시간마다 열리고 있어 점심시간에 게임을 하는 사람들을 많이 볼 수 있었다. 나도 게임 대회에 출전하기로 했다! 나는 폴가이즈에 참가하게 되었다.
어제 점심시간에 사람들이랑 했었는데 내가 1등을 했다..! <del>세상에 나 폴가이즈 몇번 안해봤는데 혹시 나 재능충인걸까...?</del></p>
<p>워크샵에서도 꼭! 1등을 하고싶다. </p>
<p>그런데 오늘 들은 얘기가 회사에서 점심시간에 게임을 해도 된다는 사실이었다.</p>
<blockquote>
<p>진짜 롤 해도 돼요....?</p>
</blockquote>
<p>근데 진짜 였다. 대신 디스코드는 하지 말라고하셨다.</p>
<p>진짜 나 여기 평생 일하고싶다. 여기 정직원이나 인턴이나 계약직으로 오려면 공부 열심히 해야겠지. 화이팅!
정말 매일매일이 동기부여의 연속이다.</p>
<h2 id="드디어-나도-일을-받게-되었다">드디어 나도 일을 받게 되었다!</h2>
<p>여기서 사내업무를 자세히 얘기하면 안될 것 같다.</p>
<p>오늘 처음으로 회의에 들어가게 되었다. 
요구사항을 잘 정리하고 회의 후 일을 받았다. </p>
<p>나는 프론트 개발로 입사를 하게 되었으니 프론트 개발을 맡게 되었다.
사실 나는 React와 JS가 제일 자신있는데 Vue와 TypeScript를 하게 되어 약간 무섭기도 하다.
하지만 새로운 프레임워크를 배우는 것은 재미있기도 하고 스스로가 성장속도가 빠른 주니어라고 생각하고 있어서 괜찮을 것 같다! ㅎㅎ</p>
<p>오늘 사수님이 이번주 까지 하라고 하신거 바로 시작해봤는데 그렇게 어려울 것 같지 않아 다행이다. 일정에 맞출 수 있을 것 같다. </p>
<blockquote>
<p>스타트업과 다른 점이 이것 같다. 전직장에서는 퇴근 후 시간이나 공휴일 주말 등도 모두 포함해서 워킹데이를 잡았는데 여기서는 현실적인 일정을 주신다. </p>
</blockquote>
<p>덕분에 집에서 따로 공부를 할 수 있다! 계약직 기간동안 열심히 공부해서 다른 곳들 인턴하며 여기 공채를 기다리다 다음 신입 채용때 꼭 지원하고 싶다.</p>
<p>진짜 최고의 직장이야 여기 사람들 채고고 다 너무 멋져버려...</p>
<h2 id="그럼에도-단점은-있어요">그럼에도 단점은 있어요.</h2>
<blockquote>
<p>키보드 마우스가 별로다.</p>
</blockquote>
<p>그냥 진짜 별로다 헤헷. 근데 이건 개인 취향의 문제도 있고 정직원/인턴/계약직 분들은 따로 구매를 해주시지 않을까..? 싶다. </p>
<p>프론트 개발자분들 대부분 mac쓰던데 여기는 mac을 쓰지 않았다. 아마도 라이브 서비스를 위한 프론트 개발이 아니라 그런걸까..? 지원이 안되나..? 잘 모르겠다.</p>
<blockquote>
<p>혹시 정직원/인턴/계약직인데 이걸보고 걱정하시는 분들은 그러지마세요..! 전 단기계약직이라 다를겁니다!
다른분들은 직접사신건지 아닌지 모르겠지만 다들 엄청 좋은 키보드 쓰고계셨어욧</p>
</blockquote>
<p>나도 월급받으면 바로 키보드 마우스 flex 해버릴거다! 후후</p>
<h2 id="약간-곤란한-점이-있다">약간 곤란한 점이 있다.</h2>
<p>그.. 정보 교육..?? 같은 윤리교육..? 을 반드시 이수해야하는데 아마 동영상 같은데
나는 데스크탑이고 내게 이어폰은 없다 ^-^.....
그냥 틀어만 놓기 아쉬운걸...? 대기업의 윤리교육.. .놓치고 싶지 않아..! </p>
<p>조만간 이어폰을 마련해야겠다. 다음주 월요일까지 이수해야하는데...</p>
<p>오늘 근무시간이 1분 모자라다. 29분 초과근무했는데 저녁을 먹어서 30분 차감되어서 1분 모자라다.
이건 한달동안 시간을 맞추면 된다고 하셨으니까 내일 화끈하게 일찍 출근해서 저녁먹고 와야겠다! 후후</p>
<p>그러려면 어서자야지.</p>
<p>공부한거 빠르게 정리하구 자야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] TypeScript (1) 정적 타입 체크]]></title>
            <link>https://velog.io/@lire_eruel/TIL-TypeScript-1-%EC%A0%95%EC%A0%81-%ED%83%80%EC%9E%85-%EC%B2%B4%ED%81%AC</link>
            <guid>https://velog.io/@lire_eruel/TIL-TypeScript-1-%EC%A0%95%EC%A0%81-%ED%83%80%EC%9E%85-%EC%B2%B4%ED%81%AC</guid>
            <pubDate>Tue, 18 Oct 2022 13:30:04 GMT</pubDate>
            <description><![CDATA[<h2 id="typescript란">TypeScript란?</h2>
<blockquote>
<p>타입스크립트는 자바스크립트에 타입이 추가된 언어입니다.</p>
</blockquote>
<ul>
<li>TypeScript는 JavaScript의 Superset이므로 기존의 자바스크립트(ES5)문법을 그대로 사용할 수 있습니다.</li>
<li>정적 타입을 지원하므로 코드의 가독성을 높이고 디버깅을 쉽게 할 수 있게 하여 협업에 용이합니다.</li>
</ul>
<h3 id="non-exception-failures">Non-exception Failures</h3>
<p>이러한 코드가 있다고 해봅시다.</p>
<pre><code class="language-typescript">const user = {
  name : &quot;daniel&quot;,
  age : 26
};

user.location;</code></pre>
<p>이 코드를 js에서 실행하면 undefined를 반환하고 ts에서는 에러를 발생시킵니다.
다시말해, js에서는 존재하지 않은 객체에 접근해도 valid 하지만 ts에서는 즉시 error를 발생시킵니다.</p>
<p>이처럼 ts에서는 컴파일 단계에서 오류를 포착할 수 있는 장점이 있어 개발 시간을 단축시킬 수 있습니다.</p>
<p>이 외에도 타입스크립트에서는 여러 문법적 버그들을 찾아줍니다. </p>
<ol>
<li>타이핑 에러</li>
</ol>
<pre><code class="language-typescript">    const announcement = &quot;Hello World!&quot;;
    // How quickly can you spot the typos?
    announcement.toLocaleLowercase();
    announcement.toLocalLowerCase();
    // We probably meant to write this...
    announcement.toLocaleLowerCase();</code></pre>
<ol start="2">
<li>uncalled function</li>
</ol>
<pre><code class="language-typescript">function flipCoin() {
 // Meant to be Math.random()
 return Math.random &lt; 0.5;
// Operator &#39;&lt;&#39; cannot be applied to types &#39;() =&gt; number&#39; and &#39;number&#39;.
}</code></pre>
<ol start="3">
<li>기본적인 문법 에러<pre><code class="language-typescript">const value = Math.random() &lt; 0.5 ? &quot;a&quot; : &quot;b&quot;;
if (value !== &quot;a&quot;) {
// ...
} else if (value === &quot;b&quot;) {
This condition will always return &#39;false&#39; since the types &#39;&quot;a&quot;&#39; and
&#39;&quot;b&quot;&#39; have no overlap.
// Oops, unreachable
}
</code></pre>
</li>
</ol>
<pre><code>### 타입스크립트 컴파일러 &quot;tsc&quot;
&gt; 설치 방법
**npm install -g typescript**

#### typeScript파일 터미널로 실행하기 

vscode에 hello.ts파일을 생성한다. 

terminal에 tsc typescript파일이름 을 작성하고 실행하면 js 파일이 생성된다.

&gt; ***tsc hello.ts ***
 -&gt; hello.js 파일 생성/업데이트

&gt; *** node hello.js***
-&gt; hello.js 파일 실행

&gt; *** tsc --noEmitOnError hello.ts ***
-&gt; 에러가 없었을 때만 hello.js 파일 생성/업데이트

**알아야 할 것!**
java는 컴파일 에러시 class 파일 생성이 되지 않지만 ts는 오류가 나도 js파일이 생성 또는 업데이트된다. 이는 오류가 나는 파일로 업데이트가 될 수 있다는 뜻이고 큰 장애를 낳을 수 있는 문제이다. 이를 방지하려면 tsc --noEmitOnError ts파일이름 을 사용하면 된다. 

### 타입 추가 해보기

이 코드를 TS로 실행시키면 결과가 어떻게 될까? 
``` typescript
function greet (person : string, date : Date) {
    console.log(`Hello ${person}, today is ${date.toDateString()}!`); 
}
greet(&quot;soni&quot;, Date());</code></pre><blockquote>
<p><strong>결과</strong>
Argument of type &#39;string&#39; is not assignable to parameter of type &#39;Date&#39;.</p>
</blockquote>
<p>그 이유는 javascript에서 new 없이 Date()를 호출하면 반환 타입이 string인데 함수에서 파라미터의 타입을 Date타입으로 지정했기 때문에 에러가 나는 것이다. </p>
<p>이를 에러가 나지 않도록 수정하면 하단의 코드이다.</p>
<pre><code class="language-typescript">function greet (person : string, date : Date) {
    console.log(`Hello ${person}, today is ${date.toDateString()}!`); 
}
greet(&quot;soni&quot;, new Date());</code></pre>
<p>참고사항</p>
<ul>
<li>변수의 타입을 명시할 때에는 &quot;변수명 : 타입&quot;의 형태를 따른다.</li>
<li>ts는 모든 변수에 전부 type annotation을 붙이지 않는다. 많은 경우 ts는 타입 추론이 가능하다.</li>
<li>상단 코드에서 <code>today is ${date}</code>도 버그를 발생시키지 않는다. 
  다만 실행결과가_ today is Mon Oct 17 2022 16:52:13 GMT +0900 (대한민국 표준시)_로 나온다.</li>
</ul>
<p>ts에서 js로 바뀌면 일어나는 일</p>
<ol>
<li>모든 type annotations가 사라진다.</li>
<li>template string이 plain string with concatenations로 변환된다.</li>
</ol>
<blockquote>
<p>point : type annotations는 절대 프로그램의 runtime behavior를 바꾸지 않습니다.</p>
</blockquote>
<h2 id="downleveling">Downleveling</h2>
<h3 id="template-strings가-plain-string으로-바뀌는-이유가-뭘까">Template strings가 plain string으로 바뀌는 이유가 뭘까?</h3>
<p>Template strings는 <em>ECMAScript_의 특정 버전 (ES6 등)의 특징이다.
TypeScript는 ECMAScript의 높은 버전 코드를 낮은 버전으로 변환하는 능력이 있다. 이를 **_downleveling</em>** 이라고 한다.</p>
<h4 id="참고자료">참고자료</h4>
<blockquote>
<p><a href="https://velog.io/@taeg92/TypeScript-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0">https://velog.io/@taeg92/TypeScript-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</a>
<a href="https://www.typescriptlang.org/assets/typescript-handbook.pdf">https://www.typescriptlang.org/assets/typescript-handbook.pdf</a> </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[쿠키/세션의 차이점]]></title>
            <link>https://velog.io/@lire_eruel/%EC%BF%A0%ED%82%A4%EC%84%B8%EC%85%98%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@lire_eruel/%EC%BF%A0%ED%82%A4%EC%84%B8%EC%85%98%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Wed, 28 Sep 2022 10:18:02 GMT</pubDate>
            <description><![CDATA[<h2 id="0-쿠키세션을-쓰는-이유는-뭘까">0. 쿠키/세션을 쓰는 이유는 뭘까?</h2>
<h3 id="텍스트http의-특징은-2가지가-있다"><strong>텍스트</strong>HTTP의 특징은 2가지가 있다.</h3>
<p><strong>1. Stateless 프로토콜</strong>
    클라이언트의 상태 정보를 가지지 않는 서버 처리 방식이다.
     어떠한 이전 요청과도 무관한 각각의 요청을 독립적인 트랜잭션으로 취급하는 통신 프로토콜이다.</p>
<p><strong>2. Connectionless 프로토콜</strong>
    클라이언트가 서버에 요청을 했을 때, 그 요청에 맞는 응답을 보낸 후 연결을 끊는 처리 방식이다.
    연결을 유지하기 위한 리소스를 줄이면 더 많은 연결을 할 수 있으므로 비 연결적인 특징을 갖습니다.</p>
<h4 id="--하지만-실제로는-데이터-유지가-필요한-경우가-많으므로-쿠키세션을-사용합니다">-&gt; 하지만 실제로는 데이터 유지가 필요한 경우가 많으므로 쿠키/세션을 사용합니다.</h4>
<h2 id="1🍪🍪-쿠키cookie-🍪🍪">1.🍪🍪 쿠키(Cookie) 🍪🍪</h2>
<ul>
<li>쿠키는 <strong>클라이언트(브라우저)</strong> 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일입니다.</li>
<li>사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징이 있습니다. </li>
<li>Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있습니다.</li>
</ul>
<p>*<em>쿠키의 동작 방식 *</em></p>
<ol>
<li>클라이언트가 페이지를 요청</li>
<li>서버에서 쿠키를 생성</li>
<li>HTTP 헤더에 쿠키를 포함시켜 응답</li>
<li>브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음.</li>
<li>같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄.</li>
<li>서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 HYYP 헤더에 포함시켜 응답</li>
</ol>
<h2 id="2-세션">2. 세션</h2>
<ul>
<li>새션은 쿠키를 기반하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 <strong>서버</strong>측에서 관리합니다.</li>
<li>서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지합니다.</li>
<li>쿠키보다 보안에 좋지만 사용자가 많아질수록 서버 메모리를 많이 차지하게 됩니다.</li>
</ul>
<p><strong>세션의 동작 방식</strong></p>
<ol>
<li>클라이언트가 서버에 접속 시 세션 ID를 발급 받음</li>
<li>클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있음</li>
<li>클라이언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 같이 서버에 전달해서 요청</li>
<li>서버는 세션 ID를 전달 받아서 별다른 작업없이 세션 ID로 세션에 있는 클라이언트 정보를 가져와서 사용</li>
<li>클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답</li>
</ol>
<h2 id="3-쿠키와-세션의-비교">3. 쿠키와 세션의 비교</h2>
<ol>
<li><strong>저장위치</strong><ul>
<li>쿠키는 클라이언트, 세션은 서버에 저장된다.</li>
</ul>
</li>
<li><strong>보안</strong><ul>
<li>세션이 쿠키보다 비교적 보안이 좋다.</li>
</ul>
</li>
<li><strong>라이프 사이클</strong><ul>
<li>쿠키는 만료 기간을 지정, 브라우저 종료시에도 유지</li>
<li>세션은 브라우저 종료시 삭제</li>
</ul>
</li>
<li><strong>속도</strong><ul>
<li>쿠키가 세션보다 빠르다. (세션은 서버에 정보가 있어 느리다)</li>
</ul>
</li>
</ol>
<blockquote>
<p>참고 자료 😎</p>
</blockquote>
<ol>
<li><a href="https://victorydntmd.tistory.com/286">https://victorydntmd.tistory.com/286</a></li>
<li><a href="https://ryusae.tistory.com/7">https://ryusae.tistory.com/7</a></li>
<li><a href="https://interconnection.tistory.com/74">https://interconnection.tistory.com/74</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Github페이지에 Svelte + Vite 프로젝트 배포하기!]]></title>
            <link>https://velog.io/@lire_eruel/Github%ED%8E%98%EC%9D%B4%EC%A7%80%EC%97%90-Svelte-Vite-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@lire_eruel/Github%ED%8E%98%EC%9D%B4%EC%A7%80%EC%97%90-Svelte-Vite-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 06 Sep 2022 06:40:42 GMT</pubDate>
            <description><![CDATA[<p>배포를 하기위해 제가 대신 굴러보았습니다..!
여러분은 그저 따라만 오십시오.</p>
<h2 id="1-내-프로젝트가-vite를-사용하고-있는지-확인한다">1. 내 프로젝트가 Vite를 사용하고 있는지 확인한다.</h2>
<p>프로젝트를 실행할 때 vite를 사용하고 있다면 </p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/5b657f83-bf79-4637-b55c-f107a72a1aeb/image.png" alt=""></p>
<p>이런식으로 실행이 됩니다. 만약 vite를 사용하고 있지 않다면 <a href="https://www.devsamples.com/javascript/svelte/deploy-svelte-app-gh-pages">이곳</a> 으로 가서 Svelte 프로젝트를 배포하는 방법을 알아보세요 😊</p>
<h2 id="2-github-repository에-code-push하기">2. github repository에 code push하기</h2>
<h3 id="터미널에서-push하는-방법">터미널에서 push하는 방법</h3>
<ol>
<li><code>$ git init</code></li>
<li><code>$ git add .</code></li>
<li><code>$ git commit -m &quot;first-commit&quot;</code></li>
<li><code>$ git branch -M main</code></li>
<li><code>$ git remote add origin http://github.com/username/repo-name.git</code></li>
<li><code>$ git push -u origin main</code></li>
</ol>
<h4 id="꼭-이렇게-안해도-되고-그냥-push를-하면-됩니다-repository에서-내-code를-볼-수-있으면-됩니다">꼭 이렇게 안해도 되고 그냥 push를 하면 됩니다. repository에서 내 code를 볼 수 있으면 됩니다.</h4>
<h2 id="3-deploying-배포하기">3 Deploying (배포하기)</h2>
<h3 id="프로젝트의-루트-디렉토리에-viteconfigjs-수정">프로젝트의 루트 디렉토리에 vite.config.js 수정</h3>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/01921213-b3e7-4822-aaed-1865df74ded9/image.png" alt=""></p>
<p>만약 배포하는 url이  <code>https://&lt;USERNAME&gt;.github.io/</code> 이런 형식이라면 base를 <code>&#39;/&#39;</code>로 하면 됩니다.
만약 <code>https://&lt;USERNAME&gt;.github.io/&lt;REPO&gt;/</code>이런식으로 repository가 뒤에 붙는다면 base를 <code>&#39;/레포지토리 이름/&#39;</code> 으로 하면 됩니다.</p>
<p>plugins에 svelte로 되어있을텐데 가만히 냅두면 됩니다. 혹시 react와 vite를 사용하고 계신다면 사진처럼 plugins가 react로 되어있을 겁니다.</p>
<h3 id="빌드하기">빌드하기</h3>
<ol>
<li><p>npm을 사용한다면<code>npm run build</code> yarn을 사용한다면 <code>yarn build</code> 터미널에서 실행하기
 <code>/dist</code> 폴더에 <code>index.html</code> , <code>assets</code>, <code>vite.svg</code>가 있는 것을 확인할 수 있습니다.</p>
</li>
<li><p>repository에 /dist 폴더를 추가 합니다.</p>
<ol>
<li><code>git add dist -f</code></li>
<li><code>git commit -m &quot;Adding dist&quot;</code></li>
<li><code>git subtree push --prefix dist origin gh-pages</code></li>
</ol>
</li>
<li><p>github 페이지 설정</p>
<ol>
<li>repository의 Settings로 들어간다.</li>
<li>왼쪽에 pages 클릭
 <img src="https://velog.velcdn.com/images/lire_eruel/post/2703a713-7436-4752-937c-b9d7bd9b81f0/image.png" alt=""></li>
<li>브랜치를 gh-pages로 변경 후 Save<img src="https://velog.velcdn.com/images/lire_eruel/post/f141db91-0de5-4eaf-8c39-8753ab6cfe81/image.png" alt=""></li>
<li>바로 반영되지는 않고 5~10분정도 걸립니다. 여유롭게 커피타임 한번 가집시다.😗</li>
<li>설정하는곳 위쪽에 떠있는 Visit site클릭해서 확인해봅니다. 혹시 잘 안되더라도 그냥 늦는거일 수 있으니 차분하게 기다려 봅니다.
<img src="https://velog.velcdn.com/images/lire_eruel/post/e495db36-5d68-4d6b-b06a-9286a26f2e45/image.png" alt=""></li>
</ol>
</li>
</ol>
<h3 id="후설정">후설정</h3>
<p>잘 되었다면 <code>package.json</code>의 <code>&quot;scripts&quot;</code>안에<br><code>&quot;deploy&quot;:&quot;npm run build &amp;&amp; git add dist -f &amp;&amp; git commit -m&#39;hosting&#39;  &amp;&amp; git subtree push --prefix dist origin gh-pages&quot;</code>를 넣어줍니다. 이미 <code>deploy</code>가 있다면 덮어씌웁니다. 수정을 합니다!</p>
<hr>
<h2 id="혹시-이렇게-했는데도-잘-안된다면-댓글-또는-메일-주세요-">혹시 이렇게 했는데도 잘 안된다면 댓글 또는 메일 주세요 :)</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[로딩속도 5분에서 5초로 줄여보았다!]]></title>
            <link>https://velog.io/@lire_eruel/%EB%A1%9C%EB%94%A9%EC%86%8D%EB%8F%84-5%EB%B6%84%EC%97%90%EC%84%9C-5%EC%B4%88%EB%A1%9C-%EC%A4%84%EC%97%AC%EB%B3%B4%EC%95%98%EB%8B%A4</link>
            <guid>https://velog.io/@lire_eruel/%EB%A1%9C%EB%94%A9%EC%86%8D%EB%8F%84-5%EB%B6%84%EC%97%90%EC%84%9C-5%EC%B4%88%EB%A1%9C-%EC%A4%84%EC%97%AC%EB%B3%B4%EC%95%98%EB%8B%A4</guid>
            <pubDate>Fri, 02 Sep 2022 11:05:45 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>다국어 채팅 앱을 개발하던 당시 겪었던 로딩속도 개선 프로젝트에 대해 정리한 글 입니다. </p>
</blockquote>
<h2 id="로딩-속도-튜닝의-필요성">로딩 속도 튜닝의 필요성</h2>
<p>우리는 채팅에 번역시스템을 추가한 서비스를 개발하고있었다.</p>
<p>채팅 앱이라면 빨리 답장해야하는 만큼 로딩속도가 중요한데 기존 앱의 로딩속도는 <strong>최소 40초에서 길면 5분</strong>까지도 걸렸다.</p>
<p>배치 처리가 되어 있지 않아 정말 문제가 많았다.</p>
<p><strong>로딩속도 개선의 목표는 3초에서 5초 이내로 잡고 로딩속도 개선 프로젝트에 참여하게 되었다.</strong></p>
<h1 id="시도-1--api-통합하기">시도 1 : API 통합하기</h1>
<h3 id="기존에-로그인을-할-때-사용하던-api들">기존에 로그인을 할 때 사용하던 API들</h3>
<ul>
<li>기존 API 로그인은 다음 과정을 순차적으로 호출합니다.</li>
</ul>
<ol>
<li><strong>로그인</strong></li>
<li><strong>이모티콘 리스트 수신</strong></li>
<li><strong>자동 친구 추가</strong></li>
<li><strong>단체방들 정보 업데이트</strong></li>
<li><strong>1:1 채팅방 정보 업데이트</strong></li>
<li><strong>메시지 번역</strong><ul>
<li>4번, 5번에서 번역을 다시 해야하는 메시지들이 있다면 서버에 메시지 번역을 요청한다. 이 때 다른 언어로부터 온 <strong>메시지가 10개라면 메시지 번역 API도 10번을 요청</strong>한다.</li>
<li>서버에서 다른 번역 서버를 한번 더 거쳐서 오기 때문에 시간이 오래 걸린다.</li>
</ul>
</li>
<li>*<em>마지막 읽은 메시지 index 수신 *</em></li>
<li>*<em>친구 목록 업데이트 *</em></li>
<li><strong>알림 설정 서버에 전송</strong></li>
<li><strong>유저 정보 조회</strong><ul>
<li>로그인 과정 중 친구 추천 리스트 생성, 채팅방 내부 유저 정보 조회를 할 때 API를 사용해서 유저 정보를 조회한다. </li>
</ul>
</li>
</ol>
<p>10가지라는 숫자가 그렇게 놀랍지 않을 수도 있지만 <strong>5번과 10번의 경우 로그인 마다 요청 횟수만도 엄청 많아서 한번 로그인할 때 많으면 정말 100개도 넘게 API를 보내고 있었다.</strong> (앱을 사용하지 않고 있는 동안 번역해야하는 메시지가 온 만큼 하나씩 번역 요청을 보냈으니.. <strong>정말 한계가 없었던 수준</strong>이다. 😂)</p>
<p>신입이었던 내 눈에도 이 과정은 너무나도 비효율적이었다.</p>
<blockquote>
<p>😒 ... API의 수가 너무 많은 것 같은데... 이거 통합해도 무리 없을 것 같은데 통합하는건 어떨까요?</p>
</blockquote>
<p>감사히 내 의견은 받아들여졌다..! 
그리고 멋진 시니어분들의 의견이 쌓여 멋지게 구조를 바꿀 수 있었다. </p>
<h2 id="통합된-api-구조">통합된 API 구조</h2>
<p>API중 단순히 정보를 받아오는 API의 경우, 하나로 통합이 되었다.
그 결과 대부분의 API 들이 통합이 되었다.</p>
<ol>
<li><strong>로그인</strong> - 유지</li>
<li><del><strong>이모티콘 리스트 수신</strong></del></li>
<li><strong>자동 친구 추가</strong> - 유지</li>
<li><del><strong>단체방들 정보 업데이트</strong></del></li>
<li><del><strong>1:1 채팅방 정보 업데이트</strong></del></li>
<li><del><strong>메시지 번역</strong></del></li>
<li><del>*<em>마지막 읽은 메시지 index 수신 *</em></del></li>
<li><del>*<em>친구 목록 업데이트 *</em></del></li>
<li><del><strong>알림 설정</strong></del> (삭제)</li>
<li><del><strong>유저 정보 조회</strong></del> (삭제)</li>
<li><strong>통합 로그인</strong> &lt;-- new!! </li>
</ol>
<h2 id="api-통합-결과-👍">API 통합 결과 👍</h2>
<blockquote>
<p>통합 로그인 API의 전송부터 수신까지 평균 15초(15000ms) 정도 걸리게 되었다.</p>
</blockquote>
<p>이전보다는 분명 개선되었다는 것이 체감이 되었다.
하지만 목표치인 3~5초에는 한참 못미쳤다.</p>
<h1 id="시도-2--통합-로그인-api에서-번역-api-분리">시도 2 : 통합 로그인 API에서 번역 API 분리</h1>
<h2 id="여전히-통합-로그인-api가-느린-이유">여전히 통합 로그인 API가 느린 이유</h2>
<blockquote>
<h4 id="서버측에서-시간이-가장-오래-걸리는-이유는-역시-번역-api-때문이었다">서버측에서 시간이 가장 오래 걸리는 이유는 역시, 번역 API 때문이었다.</h4>
<p>언어마다 사용하는 API가 달랐는데, 이 중 특정 API는 <em><strong>하나의 번역 송수신에 약 0.7초</strong>_정도나 필요하였다.
여전히 번역해야하는 수 만큼  로딩 시간도 비례한 문제점도 있었다.
예를 들어, 로그인 시도했을 때 그동안 수신된 채팅이 30개라면 _<strong>번역에만 20초</strong></em> 정도를 소모해야하는 것이다.</p>
</blockquote>
<p>하지만 번역을 굳이 로그인할 때 모두 할 필요는 없으므로 채팅을 보낼 때 서버에서 미리 번역을 해놓아 로그인 과정에서 번역을 하지 않아도 되도록 개선하였다.</p>
<h3 id="번역-api-분리-결과">번역 API 분리 결과</h3>
<p>통합 로그인 API의 전송부터 수신까지 평균 100~200ms로 현저하게 줄일 수 있게 되었다! </p>
<h1 id="시도-3--클라이언트-내부-데이터-저장-구조-변경">시도 3 : 클라이언트 내부 데이터 저장 구조 변경</h1>
<h2 id="기존-클라이언트-데이터-저장소">기존 클라이언트 데이터 저장소</h2>
<h3 id="1-redux">1. Redux</h3>
<h3 id="2-sqlite">2. SQLite</h3>
<h3 id="3-asyncstorage">3. AsyncStorage</h3>
<p>이것만 봐서는 그렇게 큰 문제는 없지 않을까? 라고 생각할 수 있다. 하지만문제는 따로 있었다.</p>
<p>대부분의 데이터를 저 세곳 모두 똑같이 저장을 한다는 점이다. 예를 들어, 
친구 목록에 관한 데이터를 저장한다고 하면 Redux에 저장하고 SQLite에도 저장을 하고 전역 변수에도 저장을 한다는 뜻이다. </p>
<p>로그인 과정에서 발생하는 모든 데이터의 업데이트도 저렇게 세곳 모두 업데이트를 계속 한다. </p>
<p>하지만 저렇게 쓴 이유는 레거시 코드이기 때문에 명확히 알 수는 없지만 추측을 하자면</p>
<p><strong>1. 상태관리를 하기 위해 Redux를 사용했다.
2. 앱을 종료했다가 다시 켜도 유지되어야하는 정보를 저장하기 위해 SQLite를 사용했다. (일반적인 Redux는 유지되지 않는다.)
3. 모든 정보를 Redux와 SQLite에 넣을 수 없으니 전역 변수에도 저장하여 개발 용이성을 높인다.</strong></p>
<h3 id="해결-방법">해결 방법</h3>
<blockquote>
<p>Redux-Persist를 사용하여 Redux의 정보가 사라지지 않도록 하면 SQLite를 사용하지 않아도 된다!
 또한 상태관리까지 한번에 할 수 있다.</p>
</blockquote>
<h2 id="1-sqlite-asyncstorage-삭제">1. SQLite, AsyncStorage 삭제</h2>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/d5368460-69da-4e50-87b0-44610d879b8d/image.png" alt="당신은 우리와 함께 갈 수 없습니다."></p>
<p>Redux-Persist를 사용한다면 SQLite를 굳이 사용할 이유가 없기 때문에 프로젝트에서 삭제하기로 하였다.</p>
<p><img src="https://velog.velcdn.com/images/lire_eruel/post/956dc31e-ec12-4792-a6cf-1de8d3054960/image.png" alt="redux-persist와 sqlite의 다운로드 비교 그래프"></p>
<p>실제로 React Native에서는 redux-persist를 SQLite보다 월등하게 많이 사용하고 있다. </p>
<p>일부 데이터는 <strong>AsyncStorage</strong>를 사용하고 있었는데... (몇몇 설정에 관한 정보)
굳이 AsnycStorage를 따로 써야하는 이유를 찾지 못했다. </p>
<p>결론 : SQLite와 AsyncStorage를 사용하는 코드는 삭제하였다. </p>
<h2 id="2-redux-persist-도입">2. Redux Persist 도입</h2>
<p>기존에 앱을 재시작해도 유지가 되어야 하는 데이터의 경우에는 SQLite에 넣었다. 그리고 그런 데이터의 경우에는 대부분 상태관리도 필요하기 때문에 Redux에도 넣었다. </p>
<p>Redux Persist를 사용하면 SQLite에 넣는 과정없이 상태관리와 데이터 저장을 한번에 할 수 있어서 효율적이다.</p>
<p>Redux를 Redux Persist로 바꾸는 과정은 그리 어렵지 않았다. 
궁금하신 분들은 <a href="https://kyounghwan01.github.io/blog/React/redux/redux-persist/#persist-store-%E1%84%89%E1%85%A1%E1%84%8B%E1%85%AD%E1%86%BC">링크</a> 에서 확인해보시면 될것 같습니다! 😊</p>
<h2 id="결과">결과</h2>
<hr />

<h4 id="우리-팀은-크게-3가지를-개선하였다--이-외에도-자잘한-변경-사항도-있다">우리 팀은 크게 3가지를 개선하였다.  (이 외에도 자잘한 변경 사항도 있다.)</h4>
<h3 id="1-비효율적인-로그인-과정에서의-api-구조">1. 비효율적인 로그인 과정에서의 API 구조</h3>
<h3 id="2-로그인과정에서-번역-제외">2. 로그인과정에서 번역 제외</h3>
<h3 id="2-비효율적인-클라이언트-내부-데이터-저장-구조">2. 비효율적인 클라이언트 내부 데이터 저장 구조</h3>
<p>그 결과, 평균 로딩시간이 기존 <strong>40초~5분</strong>에서 현재  <strong>3~5초</strong>로 <strong>90%이상</strong> 단축했다. :) </p>
<h1 id="후기">후기</h1>
<h4 id="성능을-튜닝한-경험이-생겨서-정말-기쁘다">성능을 튜닝한 경험이 생겨서 정말 기쁘다!</h4>
<p>비록 딱 같은 유저가 기존 버전에서는 ##초가 걸렸는데 지금은 #초가 걸린다!
같은 자료는 없지만 정말 개편 이전에는 하루 웬종일 로딩창을 봐야 끝났는데 이제는 잠깐만 기다려도 로딩이 끝나는 점이 너무 좋다. 실제로, 로딩이 너무 길어서 로딩이 오류가 난게 아닌가? 하고 개발자들 마저 오해하는 상황도 많을 정도로 로딩이 정~말 오래걸렸었다. 몇초가 아니라 분단위로 로딩이 필요했다... 하지만 이제는 길어도 10초안에는 로딩이 되어서 체감이 커서 좋다. 단순히 UI를 더 그리고 바꾸고 기능을 하나 더 구현하는 것보다 성능 튜닝을 위해 고민하고 개발하고 테스트할 때가 훨씬 재미있었던 것 같다. 유익한 시간이라고 생각한다 👍</p>
<h4 id="제대로-문서를-만들고-분석하고-개편하지-않은점이-아쉽다">제대로 문서를 만들고 분석하고 개편하지 않은점이 아쉽다.</h4>
<p>API하는데만 몇초정도 걸리고, 클라이언트 단에서는 어디서 얼마나 걸리는지, 기존 시간이 정확히 평균 시간이 어느 상황에서 어느 정도나 걸리는지 등을 분석하지 않고 바로 개편부터 한 점이 아쉽다. </p>
<p>API만 수정했을때 얼마나 단축되고, 내부 데이터 저장 구조만 개편 했을때 얼마나 단축되는지 미리 분석하지 않은 점이 너무 아쉽다. </p>
<p>지금 이 글을 작성하면서 성능 개선에 관한 글에는 이런 정확한 수치가 상당히 중요하다는 점을 알아 슬플 뿐이다. </p>
<h4 id="데이터-구조를-바꾸는-것은-꽤-신중해야했다">데이터 구조를 바꾸는 것은 꽤 신중해야했다.</h4>
<p>처음에는 </p>
<blockquote>
<p>아니 그냥 ~ SQLite, AsyncStorage쓰던거 redux-persist로 바꾸면 되는거니까
오래 걸려도 2주면 되겠지 😗~ </p>
</blockquote>
<p>라고 생각했다. </p>
<p>하지만 현실은 많이 달랐다. 
구조를 바꿈으로서 사소한 모든 기능을 다시 개발해야 했다.</p>
<p>앱을 새로 만들듯 다시 해야 했다. </p>
<p>QA도 생각보다 엄청 많이 나오고... 2주면 될 줄 알았는데 기존 기능을 다 구현하고 크리티컬 버그까지 전부 수정하는 데에는 2달이 넘는 시간이 필요했다.</p>
<p>데이터 구조를 바꾼다는 것은 정말 신중하게 고려하고 해야하는 점 같다. 그냥 무턱대고 성능에 나쁘다고 막 바꾸는 행동은 위험하다.</p>
<hr />


<blockquote>
<h4 id="참고자료-😎">참고자료 😎</h4>
</blockquote>
<ul>
<li><a href="https://npmtrends.com/react-native-sqlite-storage-vs-react-native-sqlite3-vs-redux-persist-vs-redux-session-storage-vs-redux-storage">https://npmtrends.com/react-native-sqlite-storage-vs-react-native-sqlite3-vs-redux-persist-vs-redux-session-storage-vs-redux-storage</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[포켓몬스터로 이해하는 Context switching!]]></title>
            <link>https://velog.io/@lire_eruel/%ED%8F%AC%EC%BC%93%EB%AA%AC%EC%8A%A4%ED%84%B0%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-Context-switching</link>
            <guid>https://velog.io/@lire_eruel/%ED%8F%AC%EC%BC%93%EB%AA%AC%EC%8A%A4%ED%84%B0%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-Context-switching</guid>
            <pubDate>Thu, 28 Jul 2022 14:28:37 GMT</pubDate>
            <description><![CDATA[<br/>
<h2>Context switching이 뭔데요?</h2>

<blockquote>
<h4>한줄 요약 : CPU가 한 개의 Task(process/Thread)의 상태를 저장하고 다음 진행할 Task의 상태값을 읽어 적용하는 과정입니다. </h4>
</blockquote>
<p>CPU는 기본적으로 한번에 한가지 일만 합니다. 하지만 우리의 프로그램들은 동시에 여러 일이 필요합니다. 하지만 중간 중간 선수 교체는 필요한 법이죠.</p>
<p>포켓몬스터를 하는데 <strong>포켓몬이 Process</strong>라고 생각하면 됩니다. 
*<em>포켓몬이 하는 일은 Thread *</em> 입니다.</p>
<p>포켓몬스터로 이해해봅시다. 
결투중 <strong>어떤 포켓몬을 사용할지는</strong> <strong>트레이너</strong>가 정합니다. 
*<em>CPU가 무슨 일을 할 지는 OS(운영체제)가 정합니다. *</em>
<br/><br/></p>
<blockquote>
<p><strong>우리는 이제부터 포켓몬 트레이너(OS)입니다.</strong></p>
</blockquote>
<img src="https://mblogthumb-phinf.pstatic.net/20130828_287/ev91_1377625244869n5vyE_JPEG/BSHG88VCEAAfUaf.jpg?type=w2" width=300/>

<br />

<blockquote>
<h3> OS : CPU가 휴식하기에는 너무 일이 많단다! 일단 하나를 하고 있으렴</h3>
</blockquote>
<br />
<img src= "https://media1.giphy.com/media/yhfTY8JL1wIAE/giphy.gif?cid=790b7611c504b8553bf4f6590c9f718b64df82ca4a9e960d&rid=giphy.gif&ct=g"></img>

<h4 id="우리는-박사님의-조언에-따라-우선-파이리를-데려가기로-했습니다">우리는 박사님의 조언에 따라 우선 파이리를 데려가기로 했습니다.</h4>
<p>파이리의 선택은 정말 좋았습니다.
당장 필요했던 <strong>안전</strong>을 지켜주고, 요리가 필요할 때에는 불도 문제가 없었습니다.</p>
<p><strong>식량</strong> 문제도 해결할 수 있었습니다.
하지만 저런,,,! 문제가 생겼습니다.</p>
<p>파이리가 불을 내고 말았습니다.</p>
<p>우리에게 필요한 것은 파이리가 아니라 꼬부기입니다...!!</p>
<blockquote>
<p>나와라 꼬부기..!</p>
</blockquote>
<p> 꼬부기는 열심히 불을 꺼줬습니다. 
 우리는 꼬부기와 함께 여행을 지속했습니다.
 역시 목 마를 때에는 꼬부기죠! </p>
<p>하지만 꼬부기랑만 다닐 수는 없습니다.</p>
<p>배는 너무 금방 꺼지고 배를 채우려면 파이리가 필요합니다.
우리는 배고파 죽을때 쯤 파이리를 다시 불렀고, 목말라 죽을때 쯤 꼬부기를 불렀습니다. </p>
<br />

<p>이쯤되면 생각이 납니다. 
<img src="https://media3.giphy.com/media/HQuZn367GgytO/giphy.gif?cid=790b761182e36c8bd7c5f6217f690a7095dffa4f307424e7&rid=giphy.gif&ct=g" ></img></p>
<blockquote>
<p>배고파 죽을것같을때, 목말라 죽을 것 같을 때 말고 그냥 정기적으로 꼬부기랑 파이리를 교체하자 ! </p>
</blockquote>
<p>그래서 우리는 스케줄을 짜기로 했습니다. </p>
<p>파이리와 꼬부기는 2시간 마다 교대로 소환되기로 하였습니다.
그리고 일도 정기적으로 하기로 했습니다.</p>
<h4 id="파이리의-업무-목록">파이리의 업무 목록</h4>
<ol>
<li>장작에 불 피우기 -  10분</li>
<li>식어가는 국 데우기 - 30분</li>
<li>꺼져가는 횟불에 불 붙이기 - 7분
...</li>
</ol>
<h4 id="꼬부기의-업무-목록">꼬부기의 업무 목록</h4>
<ol>
<li>파이리가 태운 꽃에 물주기 - 4분</li>
<li>너무 끓여서 짠 국에 물타기 - 20초</li>
<li>애교부리기 - 1시간
...</li>
</ol>
<p>파이리와 꼬부기는 업무가 많아서 모든 업무를 2시간만에 끝낼 수 없습니다. 다음에 소환될 때 이전에 하던 일을 바로 이어서 할 수 있도록 각 포켓몬은 본인이 뭘 하고 있었는지 수첩에 기록한 뒤 다음 포켓몬을 소환하기로 했습니다. </p>
<blockquote>
<h3 id="이처럼-task포켓몬-포켓몬의-업무를-교체하는-것을-context-switching이라고-합니다">이처럼 Task(포켓몬, 포켓몬의 업무)를 교체하는 것을 Context Switching이라고 합니다.</h3>
</blockquote>
<h4>우리는 2시간마다 스케줄에 맞게 포켓몬(Process)만 교체합니다. OS는 PCB(Process Control Block)정보를 바탕으로 Process를 교체합니다. 
</h4>

<h4>
포켓몬의 업무는 포켓몬의 일 이므로 우리(OS)가 관리하지 않습니다. 포켓몬은 스스로 적은 수첩을 활용하여 업무 목록에 맞게 업무를 교체합니다. Process는 TCB(Task Control Block)이라는 내부 구조를 활용하여 Thread를 관리합니다.
</h4>

<p>포켓몬들도 소환되자마자 바로 일을 시작 할 수는 없습니다. 포켓볼에 들어가기 전에 뭘 하고 있었는지 기록했던 수첩도 읽고 스트레칭도 한번 하고 일을 시작할 수 있습니다. 
CPU도 Context Switching을 수행하는 동안 Cache를 초기화하고 Memory Mapping을 초기화하는 등 바로 일을 할 수 없습니다. </p>
<h3 id="포켓몬들을-1분마다-소환한다면">포켓몬들을 1분마다 소환한다면?</h3>
<p>분명 일을 제대로 못할 겁니다. 소환되고 수첩 읽고 스트레칭하고 일 좀 할까? 하면 다른 포켓몬으로 교체될 테니까요.
대신에 업무를 자주 바꾸는건 어떨까요? 수첩읽고 스트레칭하는 시간은 필요없을테니 조금 더 시간이 절약되겠죠? </p>
<h4 id="컴퓨터도-잦은-context-switching은-성능-저하를-야기합니다">컴퓨터도 잦은 Context Switching은 성능 저하를 야기합니다.</h4>
<p>멀티 프로세스를 통해 PCB를 Context Switching하는 것 보다 멀티 Thread를 통해 TCB를 Context Switching하는  비용이 더 적습니다. </p>
<h3 id="정리">정리</h3>
<ol>
<li>Context Switch는 Process 교체와 Thread 교체가 있다. </li>
<li>Process의 스케쥴링은 OS에 의해 PCB(Process Control Block)로 관리되며 Thread는 Process에 의해 TCB(Task Control Block)로 관리된다.</li>
<li>잦은 Context Switch는 성능 저하를 야기하며 PCB의 교체보다 TCB의 교체가 비용이 더 적다.</li>
<li>댓글이나 하트로 관심을 주면 작성자가 기쁘다</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JS] 이젠 알아야지.. var let const 차이]]></title>
            <link>https://velog.io/@lire_eruel/JS-%EC%9D%B4%EC%A0%A0-%EC%95%8C%EC%95%84%EC%95%BC%EC%A7%80..-var-let-const-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@lire_eruel/JS-%EC%9D%B4%EC%A0%A0-%EC%95%8C%EC%95%84%EC%95%BC%EC%A7%80..-var-let-const-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Mon, 11 Jul 2022 14:10:48 GMT</pubDate>
            <description><![CDATA[<p><img src="https://media.giphy.com/media/dbFfNWN7sVp16/giphy.gif" alt=""></p>
<p>그동안.... var let const 애써 정확히 뭐가 다른지 무시했던 나날들... 
이제 무시할 수 없다..!</p>
<h2 id="1-호이스팅">1. 호이스팅</h2>
<hr>

<p>이 코드는 과연 실행이 될까? </p>
<pre><code class="language-javascript">a();

function a () {
  console.log(&quot;3&quot;);
}</code></pre>
<p>정답은... YES!</p>
<p>그 이유는 JavaScript는 함수의 코드를 실행하기 전에 함수 &#39;선언&#39;에 대한 메모리부터 할당합니다. 
우린 이걸 <strong>호이스팅</strong>이라고 부르기로 사회적으로 합의했어요</p>
<blockquote>
<p><strong>호이스팅</strong> : 인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것을 의미</p>
</blockquote>
<pre><code class="language-javascript">console.log(num); // 호이스팅한 var 선언으로 인해 undefined 출력
var num = 6; // 선언과 초기화</code></pre>
<p>var num = 6은 한 줄에 선언과 초기화를 했지만 호이스팅은 <strong>선언</strong>만 메모리에 미리 할당합니다.
만약 호이스팅이 되지 않았다면  <strong>ReferenceError 예외</strong>가 발생했을 겁니다.
위 코드는 아래와 같습니다.</p>
<pre><code class="language-javascript">var num;
console.log(num); // 호이스팅한 var 선언으로 인해 undefined 출력
num = 6; // 선언과 초기화</code></pre>
<p>물론, <strong>let</strong>과 <strong>const</strong>로 선언한 변수도 호이스팅 대상이지만, 
호이스팅시 undefined로 변수를 초기화 하지 않습니다. 
따라서 </p>
<pre><code class="language-javascript">console.log(num); // 호이스팅이 되었지만 let으로 ReferenceError 예외
let num = 6; // 선언과 초기화</code></pre>
<p>var가 아닌 let으로 선언했다면 undefined로 초기화가 되어있지 않고 메모리 할당만 되어있어  <strong>ReferenceError 예외</strong>가 발생한다. </p>
<h2 id="2-변수-재선언-재할당">2. 변수 재선언, 재할당</h2>
<pre><code class="language-javascript">var a = apple;
var a = tree; // OK!

let b = pretty;
let b = cute; // SyntaxError!
b = beautiful; // OK!

const b = cat;
const b = dog; // SyntaxError!
b = bird; // TypeError!</code></pre>
<p>var의 경우 변수 재선언이 가능하다.</p>
<p>따라서 같은 이름으로 변수 선언해도 오류가 나지 않음.
하지만 let과 const는 변수 재선언은 안된다. 
const는 재할당도 되지 않는다.</p>
<h3 id="이젠-알자-const-재할당">이젠 알자, const 재할당!</h3>
<pre><code class="language-javascript">const a = [1,2,3];
a.push(3); //ok!

const b = {name : &quot;jon&quot;}
b.name = &quot;happy&quot;//ok!
b = a; //TypeError!</code></pre>
<p>const가 보호해주는 것은 할당 주소값이지 객체의 내용은 아닙니다. 
따라서 배열이나 객체 속 내용은 변경해도 괜찮습니다. 하지만 아예 const로 할당된 객체에 다른 객체를 할당하면 안됩니다. </p>
]]></description>
        </item>
    </channel>
</rss>