지금까지 GET 요청, POST 요청도 보내봤고 쿼리를 넣어서 보내보기도 했다.
이제는 UPDATE 문이다. 유저가 어떤 게시글에 대해 장바구니 버튼을 클릭하면 유저가 스크랩한 글 목록에 저장되어야 한다.
아 이게 CRUD에서의 3번째, Update 요청이구나.
https://repo.yona.io/doortts/blog/issue/12
이 문서에 의하면 Update 요청은 PUT 요청이 아니라 POST 요청이 적절하다고 한다. PUT 요청은 payload(request 바디 상 데이터)에 의해서 새로운 리소스(객체)를 생성하거나 대체할 때 쓰는 것이라 한다. 우리는 기존의 객체 상 필드값만을 바꾸고자 하는 것이므로 PUT 요청은 적절하지 않다는 것이다.
그렇다면 다음과 같이 요청을 보내야 하는 것이 맞을 것이다.
// 3번 유저의 장바구니에 post_id번 포스트를 추가.
POST /user/{user_id}
{
postScrapped: {post_id}
}
그렇다면 나의 의문은 이것이다. 3번 유저를 생성해야 하는 경우에는? 그때는 PUT 요청을 보내야 하는 것인가?
무언가를 생성하는 건 POST 요청이라고 배웠는데....
아, 아니다. 새로운 유저 객체를 생성해야 한다면,
POST /user
이렇게만 하면 되는 것이다. 구체적으로 user_id를 url에 명시한다면, 그건 존재하는 객체에 대한 수정을 가하는 것으로 생각하면 될 것이다.
그런데 의문점이 또 생긴다. 유저의 장바구니에 어떤 인스턴스를 추가하는 것 말고, 어떤 게시글의 '좋아요'가 1 증가하도록 하고 싶다고 해보자. 어떤 게시글의 좋아요수를 업데이트 하기 위한 URL은 어떻게 지정할 것인가?
POST /post/{post_id}/likes
가 적절하지 않을까? 그런데 그렇다면 좋아요 수를 내리는 API는?
payload에 +인지, -인지를 명시하는 방법이 있을 수 있다.
(---> POST 대신 DELETE 요청을 보내는 방식으로 문제를 해결하면 payload를 들여다보지 않아도 된다!)
그렇다면 이렇게 합의를 볼 수 있을 것 같다.
어떤 모델(say, post)의 필드를 업데이트하는 API
PUT /post/{post_id}/field/{업데이트내용}
그럼 뷰함수에서 필드마다 어떻게 처리되어야 하는지를 하나하나 다 지정해주어야 하는가? 어떤 건 Boolean 타입일 거고, 어떤건 정수형, 어떤건 문자열, 어떤건 리스트 등일 것이다.
스스로 결론을 내리기 어려워서 질문을 남겼다.
이렇게 담기게 된다. 하지만 바꿔야 하는 필드가 여러개라면? 포스트를 한 번 수정하면 제목, 내용 등 여러 항목을 수정하는 코드를 작성헤야 한다.