<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>line_number_two.log</title>
        <link>https://velog.io/</link>
        <description>Hello 🤚</description>
        <lastBuildDate>Mon, 13 May 2024 16:44:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. line_number_two.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/line_number_two" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[GraphQL]]></title>
            <link>https://velog.io/@line_number_two/GraphQL</link>
            <guid>https://velog.io/@line_number_two/GraphQL</guid>
            <pubDate>Mon, 13 May 2024 16:44:54 GMT</pubDate>
            <description><![CDATA[<h4 id="장점">장점</h4>
<ul>
<li><strong>Overfetching</strong>: 필요로 하는 데이터만 가져올 수 있습니다.</li>
<li><strong>Underfetching</strong>: 한번의 요청으로 필요한 데이터만 가져올 수 있습니다.</li>
<li><strong>Subscription</strong>: 구독 해놓은 리소스가 업데이트될 때마다 알림을 받아서, 실시간 처리를 할 수 있습니다. 웹소켓을 사용해야합니다. </li>
</ul>
<h4 id="단점">단점</h4>
<ul>
<li><strong>Learning Curve</strong>: REST API에 비해 상대적으로 배우기 어렵습니다.</li>
<li><strong>Caching</strong>: 복잡한 쿼리를 해석해서 작업들을 실행하기 때문에 서버에 부담을 줄 수 있습니다.</li>
</ul>
<h4 id="특징">특징</h4>
<ul>
<li><strong>POST</strong>: 모든 요청이 POST로 이루어집니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[REST API = REST + API ]]></title>
            <link>https://velog.io/@line_number_two/REST-API%EB%9E%80</link>
            <guid>https://velog.io/@line_number_two/REST-API%EB%9E%80</guid>
            <pubDate>Sun, 12 May 2024 21:47:04 GMT</pubDate>
            <description><![CDATA[<p>REST API는 REST 아키텍처 원칙을 따르는 API입니다.</p>
<hr>
<h3 id="apiapplication-programming-interface">API(<em>Application Programming Interface</em>)</h3>
<p>API는 어플리케이션, 서비스, 라이브러리 간의 인터페이스를 정의하는 <strong>계약</strong>입니다. 이를 통해 서로 다른 소프트웨어가 서로 상호 작용할 수 있도록 돕습니다.</p>
<h3 id="restrepresentational-state-transfer">REST(<em>REpresentational State Transfer</em>)</h3>
<p>REST는 <strong>리소스 기반의 아키텍처 스타일</strong>로, 웹의 기본 원리를 활용하여 정보를 구성하고 전달하는 방법을 제공합니다. 이 아키텍처 스타일은 네트워크 리소스를 정의하고, 이 리소스에 대한 요청을 통해 데이터를 교환하는 것을 기반으로 합니다.</p>
<h4 id="rest의-핵심-원칙">REST의 핵심 원칙</h4>
<ul>
<li><strong>클라이언트-서버 구조</strong>: 클라이언트와 서버가 독립적으로 동작하여 각각의 개발과 확장에 용이합니다.</li>
<li><strong>무상태성(<em>Statelessness</em>)</strong>: 각 요청이 독립적이며, 이전 요청의 정보를 필요로 하지 않습니다.</li>
<li><strong>캐시 가능성(Cacheable)</strong>: 리소스는 캐시가 가능해야 하며, 이는 성능 향상과 서버 부하 감소에 기여합니다.</li>
<li><strong>계층화</strong>: 클라이언트는 물리적으로 서버와 분리된 여러 계층을 통해 서비스를 받을 수 있습니다.</li>
<li><strong>통일된 인터페이스</strong>: 표준 HTTP 메소드를 사용하여 리소스를 관리합니다.</li>
<li><strong>리소스 지향</strong>: 웹의 모든 콘텐츠는 리소스로 표현되며, 각 리소스는 고유한 URI를 갖습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[멱등성이란?]]></title>
            <link>https://velog.io/@line_number_two/%EB%A9%B1%EB%93%B1%EC%84%B1%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@line_number_two/%EB%A9%B1%EB%93%B1%EC%84%B1%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Fri, 10 May 2024 11:03:08 GMT</pubDate>
            <description><![CDATA[<p>멱등성에 대해 구글링 해서 여러 글들을 읽어봐도 이해되지 않는 부분이 많았습니다.
개인적으로 멱등성과 일관성의 큰 차이를 느끼지 못해서 더 헷갈렸던 것 같습니다.</p>
<p>그래서 개념을 잘 잡아보고자 모두의 친구 ChatGPT와 티키타카를 해보았습니다 😎</p>
<hr>
<h4 id="멱등성">멱등성</h4>
<blockquote>
<p>멱등성은 특정 연산이나 요청을 여러 번 수행하더라도 첫 번째 수행 이후에는 추가적인 효과가 없음을 의미합니다.</p>
</blockquote>
<h4 id="일관성">일관성</h4>
<blockquote>
<p>일관성은 시스템이 특정 규칙이나 정책에 따라 항상 일관된 상태를 유지함을 의미합니다.</p>
</blockquote>
<p>HTTP 메소드들은 크게 두 가지 특성을 가질 수 있습니다. </p>
<ul>
<li><strong>안정성(Safety)</strong>: 해당 메소드로 서버의 상태가 변경되지 않습니다.</li>
<li><strong>멱등성(Idempotence)</strong>: 여러 번 수행해도 결과가 동일해야 합니다.</li>
</ul>
<p>그리고 메소드 별로 어떤 특성을 갖고 있는지 구분되어 있습니다.</p>
<ul>
<li><strong>멱등하고 안전한 메소드</strong>: <code>GET</code>, <code>HEAD</code>, <code>OPTIONS</code></li>
<li><strong>멱등하고 안전하지 않은 메소드</strong>: <code>PUT</code>, <code>DELETE</code></li>
<li><strong>멱등하지 않고 안전하지도 않은 메소드</strong>: <code>POST</code></li>
</ul>
<hr>
<h3 id="멱등하지-않고-안전하지-않으면-안좋은거-아닌가-🤔">멱등하지 않고, 안전하지 않으면 안좋은거 아닌가? 🤔</h3>
<p>아닙니다! 오히려 특성으로부터 어떤 상황에 어떤 메소드를 사용해야 한다는 개념이 생기지 않았을까? 라는 개인적인 생각입니다.</p>
<hr>
<p>상황 예시를 보시면 이해하기 더 수월하실거에요!</p>
<h4 id="비멱등한-get-요청">비멱등한 GET 요청</h4>
<ul>
<li><strong>부수 효과</strong>: 특정 게시물에 들어가서 GET 요청을 했는데 계속해서 조회수가 올라가는 경우</li>
<li><strong>캐시 무효화</strong>: GET 요청을 받을 때마다 캐시를 무효화하고 데이터를 새로 고침할 경우, 캐시 무효화 자체가 서버 상태를 변경하는 것은 아니지만, 결과적으로 서버가 다음 요청에 다른 데이터를 제공할 가능성이 있음</li>
</ul>
<h4 id="비멱등한-put-요청">비멱등한 PUT 요청</h4>
<p><em>점수를 업데이트하는 API가 있다고 가정</em></p>
<ul>
<li><strong>잘못된 설계</strong>: <code>기존 점수 + 추가 점수</code> 로 계산하는 로직</li>
<li><strong>올바른 설계</strong>: 요청으로 받은 점수로 갱신하는 로직</li>
</ul>
<hr>
<p>🔊 <strong>뇌피셜이 많이 섞인 내용이라, 정확하지 않을 수 있습니다. 참고만 해주세요!</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트는 비동기 언어? 🤔]]></title>
            <link>https://velog.io/@line_number_two/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%96%B8%EC%96%B4</link>
            <guid>https://velog.io/@line_number_two/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%96%B8%EC%96%B4</guid>
            <pubDate>Thu, 09 May 2024 14:55:14 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트는 <strong>싱글 스레드</strong> 기반의 <strong>동기적인</strong> 언어입니다.</p>
<p>처음 만들어졌을 때는 웹 페이지에서 간단한 상호작용을 처리하는 것이 주목적이었기 때문에, 초기의 자바스크립트는 매우 단순하고 제한된 기능을 가지고 있었습니다.</p>
<h4 id="example-of-synchronous">Example of synchronous</h4>
<pre><code class="language-js">console.log(&#39;First&#39;)
console.log(&#39;Second&#39;)
console.log(&#39;Third&#39;)</code></pre>
<h4 id="output">Output</h4>
<pre><code>First
Second
Third</code></pre><hr>
<p>초기의 자바스크립트는 비동기 처리를 할 때 Callback 함수를 사용했습니다. 그러나 비동기 작업이 여러 단계에 걸쳐 이루어질 경우 복잡한 중첩 구조를 가지게 되어서 가독성이 좋지 않고 에러 처리를 하기 어려웠습니다.</p>
<h4 id="example-of-callback-hell">Example of callback hell</h4>
<pre><code class="language-js">getData(function(err, data) {
    if (err) {
        console.error(&#39;첫 번째 작업 실패&#39;, err);
        return;
    }
    processData(data, function(err, processedData) {
        if (err) {
            console.error(&#39;데이터 처리 중 에러 발생&#39;, err);
            return;
        }
        saveData(processedData, function(err) {
            if (err) {
                console.error(&#39;데이터 저장 실패&#39;, err);
                return;
            }
            console.log(&#39;작업 완료&#39;);
        });
    });
});</code></pre>
<hr>
<p>그래서 ES6 이후에 순차적으로 생겨난 개념이 <code>Promise</code> 와 <code>async/await</code> 입니다.</p>
]]></description>
        </item>
    </channel>
</rss>