<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>53_eddy_jo.log</title>
        <link>https://velog.io/</link>
        <description>나부터 만족하는 소프트웨어를 만들고 싶은 개발자.</description>
        <lastBuildDate>Fri, 11 Dec 2020 13:53:21 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>53_eddy_jo.log</title>
            <url>https://images.velog.io/images/53_eddy_jo/profile/38dd502e-a86e-4786-a7a9-0b696e542889/04E69635-C317-4DC8-AE7F-21C72829741B.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 53_eddy_jo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/53_eddy_jo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[RESTful한 세계에서의 POST와 PUT의 차이, 거기에 PATCH까지]]></title>
            <link>https://velog.io/@53_eddy_jo/RESTful%ED%95%9C-%EC%84%B8%EA%B3%84%EC%97%90%EC%84%9C%EC%9D%98-POST%EC%99%80-PUT%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EA%B1%B0%EA%B8%B0%EC%97%90-FETCH%EA%B9%8C%EC%A7%80</link>
            <guid>https://velog.io/@53_eddy_jo/RESTful%ED%95%9C-%EC%84%B8%EA%B3%84%EC%97%90%EC%84%9C%EC%9D%98-POST%EC%99%80-PUT%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EA%B1%B0%EA%B8%B0%EC%97%90-FETCH%EA%B9%8C%EC%A7%80</guid>
            <pubDate>Fri, 11 Dec 2020 13:53:21 GMT</pubDate>
            <description><![CDATA[<p>처음에 HTTP 통신을 배울 때, POST와 GET의 차이를 배우게 된다.  그리고 그 두METHOD의 차이에 대한 질문이 신입사원 단골 기출 면접 문제로 인터넷 상에 널리 퍼져있다. 실제로 내가 2017년도에 신입사원으로 첫 직장들을 지원했을 때, POST와 GET의 차이에 대한 질문을 여러 번 받아보기도 하였다.</p>
<p>2017년도에서 3년정도 지나, RESTful API가 널리 쓰이고 있는 현재에서는 RESTful API에서 POST와 PUT의 차이가 이제는 그 주요 질문 항목에 들어 갈 수 있을 거 같다.
(2017년도만 해도, 나는 RESTful API의 개념 정도만 들어봤고, 실제는 써본 적이 없었다.)
(그리고 요즘 경력 개발자 채용 공고를 찾아보면, Back-end 개발자 기준으로 RESTful API 에 대한 항목이 대부분 기재되어 있는 것을 보면, RESTful API에 대한 역량이 필수적으로 자리메김한 거 같다.)  </p>
<p>이런 이유로 HTTP세계를 넘어 RESTful한 세계에서의 POST와 PUT차이를 알아보고자 한다.</p>
<p>먼저 간단하게, 다들 알고 있는 RESTful API에 대해 간략하게 정리해보자.</p>
<h2 id="🙈-restful-api란">🙈 RESTful API란?</h2>
<blockquote>
<p>자원을 URI로 표현하고, 자원에 대한 행위를 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.</p>
</blockquote>
<p>간략하게 말한다면, 위와 같은 스타일을 따르는 API라고 볼 수 있다.</p>
<p>*RESTful API에 대해 자세히 말하고자 한다면, 이 페이지로는 모자를 거 같고, 이번 주제가 아니기에 다음에 자세히 다뤄보기로 하겠다.</p>
<p>이제 본래 주제인 RESTful한 세계에서의 POST와 PUT의 차이를 살펴보자.</p>
<h2 id="🔑post-vs-put">🔑POST vs PUT</h2>
<blockquote>
<p>자원에 대한 행위를 나타내는 4가지 Method는 CRUD(Create/Read/Update/Delete)에 각각 매칭된다. </p>
</blockquote>
<p>POST는 Create(생성), PUT은 Update(수정)에 매칭되는데, RESTful API는 자원에 대한 행위를 4가지 Method로 표한하니까, <em>자원에 대한 생성은 POST</em>가 담당하고, <em>자원에 대한 수정은 PUT</em>이 담당하는 것이다. </p>
<p>보통 이렇게 정의하지만, 나도 이런 정의만 보고 도대체 어떻게 다른지 감을 잡기 힘들었다. 여러분들은 이런 어려움이 없으면 하는 마음에 자세하게 예를 들어 설명해보겠다.</p>
<p>아래와 같은 URI가 있고, 해당 URI에 대해 POST와 PUT이 작동하는 예를 보자.
<code>/student</code></p>
<p>POST 메소드로 뽀로로라는 이름을 가진 학생을 생성하기 위에 아래와 같이 요청하면, 고유 구분값인 id를 1로 설정되어 뽀로로라는 학생이 생성된다.</p>
<pre><code>HttpRequest
POST /student
{
  “name”: “뽀로로”,
  “grade”: 1
}

HttpResponse
HTTP/1.1 200 OK
{
  “id”: 1,
  “name”: “뽀로로”,
  “grade”: 1
}</code></pre><p>그러면 이제, PUT을 통해 뽀로로의 grade를 2를 변경해보자. PUT은 리소스에 대한 수정이므로     특정 리소스를 구분하는 id값을 넣어줘야 한다.</p>
<pre><code>HttpRequest
PUT /student/1
{
  “grade”: 2
}

HttpResponse
HTTP/1.1 200 OK
{
  “id”: 1,
  “name”: “뽀로로”,
  “grade”: 2
}</code></pre><p>이는 POST와 PUT의 가장 기본적인 사용예제이고, 두 메서드의 차이를 조금 더 자세히 알아보기 위한 예제를 또 살펴보자.</p>
<p>POST 메서드로 뽀로로 학생을 생성해달라고 2번 요청하면 어떻게 될까?</p>
<pre><code>POST /student
{
   “name”: “뽀로로”,
   “grade”: 1
}</code></pre><p>id가 1과 2인 뽀로로가 두 개가 생겨버린다. POST는 리소스를 생성하기 위한 메서드로 요청한 횟수마다 새로운 리소스를 생성한다. 
(물론 name을 unique key로 잡으면 같은 이름으로 생성하지 안되게 만들 수는 있다.) </p>
<pre><code>HTTP/1.1 200 OK
{ “id”: 1, “name”: “뽀로로”, “grade”: 1 }

HTTP/1.1 200 OK
{ “id”: 2, “name”: “뽀로로”, “grade”: 1}</code></pre><p>반대로 PUT으로 같은 요청을 두번 보내면 어떻게 될까?</p>
<pre><code>PUT /student/3
{
  “name”: ”에디”
  “grade”: 2
}</code></pre><p>2번 아니, 수백번 보내도 아래와 같이 같은 응답이 온다. id를 3을 가진 리소스는 없었으므로, 최소 한번은 생성되고, 그 후에는 생성되지 않는다.</p>
<pre><code>HTTP/1.1 200 OK
{ “id”: ”3”, “name”: “에디”, “grade”: 2 }</code></pre><p>예시를 들며 설명했던 내용을 다시 정리해보면,</p>
<ul>
<li>POST<ul>
<li>POST는 리소스의 생성을 담당한다.</li>
<li>POST는 요청 시 마다, 새로운 리소스가 생성된다.</li>
</ul>
</li>
<li>PUT<ul>
<li>PUT은 리소스의 생성과 수정을 담당한다.</li>
<li>PUT은 요청 시 마다, 같은 리소스를 반환한다</li>
<li>물론, 리소스 안에 속성은 변경될 수 있다.</li>
</ul>
</li>
</ul>
<p>이를 어려운 말로 이야기하면, <em>PUT은 멱등하다</em>고 말할 수 있고, <em>POST는 멱등하지 않다</em>라고 말한다.</p>
<h2 id="👀그렇다면-patch와-put은">👀그렇다면 PATCH와 PUT은?</h2>
<p>PATCH도 수정을 담당하는 메서드라는데, PUT도 수정에 사용되는 거라고 한다. 그렇다면 이 둘은 어떻게 다른 것인가?</p>
<p><em>PATCH는 수정만 담당하며 리소스의 일부분만 수정</em>할 때 사용하고, <em>PUT은 리소스의 모든 속성을 수정</em>하기 위해 사용한다.</p>
<h2 id="⚰️끝맺으며">⚰️끝맺으며..</h2>
<p>여기까지 RESTful API에서 POST와 PUT이 어떻게 다른지 알아보았고, 추가적으로 PATCH까지 간략하게 살펴보았다. 물론 이 차이가 RESTful API에만 적용되는 것이 아니고, HTTP에서도 적용되는 것을 잊으않았으면 한다. 예를 들어 RESTful API를 통해 설명한 것 뿐이다.</p>
<p>참고 : 1ambda.github.io/javascripts/rest-api-put-vs-post/</p>
]]></description>
        </item>
    </channel>
</rss>