본문 바로가기

천천히 배움,/Front-End

[Network] REST API, 그리고 POST와 PUT

REST API 란 무엇일까??

 

REST(Representational State Transfer)는 소프트웨어 아키텍쳐의 하나로, HTTP 통신을 위한 규약(규칙)이라고 할 수 있다.

이 아키텍쳐 스타일의 디자인을 잘 따른 시스템을 'RESTful'하다고 표현하기 때문에, 이를 잘 지킨 api를 REST API 또는 RESTful API라고 부른다.

 

 

1. REST의 기본 규칙

  • URI를 통해 자원을 표현하고,
  • HTTP Method (GET, POST, PUT, PATCH, DELETE)를 통해 자원에 대한 행위를 정의한다.
  • 추가적으로 자원에 대한 행위의 내용 즉, HTTP Method에 대한 내용은 payload(또는 body라고 함)로 표현한다.

2. HTTP Method

GET, POST, PUT, PATCH, DELETE를 사용해 CRUD를 구현한다.

CRUD는 기본적인 데이터 처리 기능으로 생성(Create), 읽기(Read), 갱신(Update), 삭제(Delete)를 일컫는다.

 

Method Action (행위) Payload (Body)
GET 리소스 조회 X
POST 리소스 생성 O
PUT 리소스 전체 수정(교체) O
PATCH 리소스 일부 수정 O
DELETE 리소스 삭제 X

 

 

비동기 통신을 할 때 꼭 알아둬야 하는 내용으로 특히 GET, POST가 많이 사용된다. 

GET은 대부분의 경우 body가 필요 없지만, POST는 body가 필수라는 것을 꼭 기억하자!

 

공부할 때에는 리소스 수정 시에 put이나 patch를 사용하는 것으로 배웠는데, 막상 실무에서 사용하는 api를 살펴보니 POST를 주로 사용해 정보를 수정하고 있었다. 조금 신기방기!

 


 

POST vs PUT

 

위의 마지막 부분에서 언급한 '실무에서 리소스 수정 요청 시에 POST를 사용하고 있었다'는 내용으로 그렇다면 RESTful한 API 통신이 아니지 않냐라는 질문을 받았다. 질문을 받고 생각을 해보니 정말 조금 애매하다..고 느꼈다. restful하다고 하기도 그렇고 아니라고 하기도 그렇고..? 뭐 회사에서 해당 api 만든 개발자분이 나름의 이유를 가지고 했겠지만, 당사자분이 현재 계시지 않아 왜 그렇게 설계를 하셨는지는 알 수 없다. 

 

해서, POST와 PUT의 차이에 대해 알아보려 한다!

 

POST는 리소스를 생성하는 역할로 매 요청마다 고유한 key와 함께 새로운 리소스를 생성해준다.

예를 들어, user 생성을 요청해보자!

 

// Request
// POST/user
{
	"nickname": "margu",
    "email": "example@nuest.com"
}

// Response
{
	"key": 1234,
    "nickname": "margu",
    "email": "example@nuest.com"
}

 

만약 POST로 동일한 요청을 연속해서 보내면, key가 다른 새로운 리소스를 계속해서 생성해준다. 

 

// Request
{
    "nickname": "margu",
    "email": "example@nuest.com"
}

// Response
{
	"key": 1234,
    "nickname": "margu",
    "email": "example@nuest.com"
}

// Response
{
	"key": 5678,
    "nickname": "margu",
    "email": "example@nuest.com"
}

 

 

반면에, PUT은 기존 리소스에 대한 내용을 수정할 때 사용하므로 요청 보낼 때 해당 리소스의 key(또는 id)를 함께 적어 수정 사항과 요청을 날린다. 

기존 nickname을 margu에서 sweet으로 변경 요청을 보내보자.

 

// Request
// PUT/user/1234
{
	"nickname": "sweet",
}

// Response
{
	"key": 1234,
    "nickname": "sweet",
    "email": "example@nuest.com"
}

 

PUT은 매 요청마다 동일한 리소스를 반환한다. 즉, 위와 같은 요청을 계속 보내면 동일하게 key 1234에 해당하는 리소스를 반환하고 새로 생성하지 않는다. 다만, 만약에 요청을 보낸 key를 가진 리소스가 없다면 새로운 리소스를 생성해 반환하게 된다.

 

// Request
// PUT/user/1010
{
	"nickname": "sweetmargu",
    "email": "mh@nuest.com"
}

// Response
{
	"key": 1010,
    "nickname": "sweetmargu",
    "email": "mh@nuest.com"
}

 

 

🍑 정리해보자면,

POST는 리소스를 생성하는 것이 주 목적으로, 동일한 요청에 대해서도 매번 새롭게 리소스를 만들어서 반환한다.

PUT은 리소스의 수정과 생성을 담당하여, 요청할 리소스에 대한 명시를 하고(위에서 key와 같은) 동일한 요청에 대해서 같은 리소스를 반환한다. (리소스 안의 속성은 변경될 수 있으므로 동일한 것은 아니다)