coding/JS

rest API PUT/PATCH/POST

JIN_Coder 2022. 7. 27. 23:20

RESTful API

자원(Resource)을 URI로 표현하고, 자원에 대한 행위를 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.

 

나만의 방식대로 이해해서 정리한거는

자원과 메소드로 무슨 api인지 알수 있게 이쁘고 잘 만든 api가 restful 하다라고 생각이 드는데 맞는건가?

 

 

보통 CRUD에서 조회는 GET, 등록은 POST, 수정은 PUT, PATCH, 삭제는 DELETE를 이용

GET과 DELETE는 행위가 명확 하지만 

수정의 PUT과 PATCH에 대해 알아볼까 한다.

 

PUT

요청 페이로드를 사용해 새로운 리소스를 생성하거나, 대상 리소스를 나타내는 데이터를 대체한다.

 

PATCH

리소스의 부분적인 수정을 할 때에 사용한다.

 

결론부터 보면 PUT은 자원의 모든 상태를 받아 수정할때 사용하고,

PATCH는 자원의 일부분을 받아 해당 부분만 수정할때 사용

 

 

/student 하는 경로로 PUT, PATCH를 사용 할때의 차이점

{“id”: 1, “name”: “뽀로로”, “grade”: 1}
// PUT
PUT /student/1
{“grade”: 2}

{“id”: 1, “name”: null, “grade”: 2}
  
  // PATCH
 PATCH /student/1
{“grade”: 2}

{“id”: 1, “name”: "뽀로로", “grade”: 2}

put은 모든데이터를 받아 수정을 하는데 이름을 받지 않아 name이 null로 변하였고,

patch는 일부분만 받아도 해당 부분만 수정 하기때문에 기존 name의 뽀로로는 남아있게 된다.

 

 

추가로 기존의 값이 없을 경우

// PUT
PUT /student/2
{“name”: "루피", “grade”: 2}

{“id”: 1, “name”: "뽀로로", “grade”: 2},
{“id”: 2, “name”: "루피", “grade”: 2}
  
// patch
PATCH /student/2
{“name”: "루피", “grade”: 2}

{“id”: 1, “name”: "뽀로로", “grade”: 2}
오류 발생

기존의 값이 없을 경우 put은 post 처럼 새로운 데이터를 생성하지만,

patch는 새로운 값을 생성하지 않고, 오류를 응답으로 보낸다.

 

 

마지막으로 put과 post 의 차이

차이점을 말하기전 멱등성을 알아야 한다.

멱등성이란, 동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고,
서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 말한다.

 

put, post를 2번씩 사용한다면?

// post
POST /student
{“name”: “뽀로로”, “grade”: 1}
POST /student
{“name”: “뽀로로”, “grade”: 1}

{ “id”: 1, “name”: “뽀로로”, “grade”: 1 },
{ “id”: 1, “name”: “뽀로로”, “grade”: 1 }

// put
PUT /student
{“name”: “뽀로로”, “grade”: 1}
PUT /student
{“name”: “뽀로로”, “grade”: 1}

{ “id”: 1, “name”: “뽀로로”, “grade”: 1 }

post는 2번 실행 시 2개의 데이터를 생성한다.

하지만, put의 경우는 처음 요청에는 기존의 데이터가 없었기 때문에 최초 1번 생성 후 그 후에는 수정의 의미로 사용되어 1개의 값만 남게 된다.

10번씩 했다면 post는 10개의 값 생성, put은 처음 실행만 값을 생성 후 나머지 9번은 수정의 의미로 실행된다.

 

어려운 말로 말하자면, PUT은 멱등하다고 하고, POST는 멱등하지 않다라고 한다.

동일한 요청을 한번 보내는 것과 여러번 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하기 때문에 멱등하다고 한다.

 

 

 

 

 

'coding > JS' 카테고리의 다른 글

js 객체 비구조화 할당  (0) 2022.07.29
네이버 지도 API  (0) 2022.07.28
for in / for of  (0) 2022.07.27
slice()와 splice() 차이  (0) 2022.07.19
slice, 정규식  (0) 2022.07.18