모든 개발자를 위한 HTTP 웹 - 4. HTTP 메서드 - GET, POST, PUT, PATCH, DELETE
< 질문 정리 >
Q. /orders/{orderId}/start-delivery 는 '배달 상태 변경'의 의미에서 POST가 아닌 PATCH를 사용해야 하는것 아닌가?
-> '배달 상태'를 변경한다는 것은 단순히 해당 리소스의 값을 변경하는 정도로 끝나는 것이 아니라, 내부에서 매우 큰 프로세스가 실행된다. 이렇게 해당 리소스만 변경하는 것이 아니라 '내부 프로세스를 실행해야할 때'는 PATCH보다 POST를 사용하는 것이 좋다. 단순히 회원 정보를 변경하는 것처럼 '특정 리소스의 데이터를 병경할 때'는 PATCH를 사용하는 것이 좋다.
Q. GET 메서드를 사용해 복수 개의 리소스를 조회할 때, URI를 어떤식으로 설계하는것이 좋을까?
-> 예를 들어, id가 3,4,5,인 회원을 조회하고 싶다면 path를 사용하기 보다는 query string을 사용하는 것이 더 좋다.
< 정리 >
PUT은 완전히 리소스를 대체(덮어씀)할 때 사용하고 PATCH는 리소스를 부분변경할 때 사용한다.
요청받은 리소스(URI)가 없을 때, PUT은 신규리소스를 생성해주지만, PATCH는 리소스가 없다는 오류가 발생해야 한다.
-> 요즘에는 PATCH가 거의 다 지원이 되지만 혹시나 PATCH가 지원되지 않으면, POST를 사용한다.
< 질문 정리 >
Q. '회원 정보'를 수정할 때, PATCH를 사용하면 변경되는 필드가 무엇이냐에 따라 코드를 다 따로 작성해야하기 때문에 중복되는 코드가 많아지므로 PUT으로 전체를 덮어쓰게끔 했다. 만약에 PATCH를 사용한다면, 어떤식으로 구현해야 좋은 코드를 짤 수 있을까?
-> update쿼리를 '동적 쿼리'가 되도록 구성하면 된다. 예를 들어, 클라이언트에서는 변경된 값만 서버에 넘기고, 서버에서는 필드에 값이 있는 경우에는 update set 조건으로 추가하고, 값이 null인 경우에는 update set 조건에서 제외하는 식으로 만들면 된다.
-> '동적 쿼리'란 특정 조건이나 상황에 따라 쿼리가 변경되어야 하는 경우를 말한다.
Q. 실무에서 DELETE의 응답메세지(status code)를 어떻게 처리하는가?
-> 대부분 200을 사용하고, 상황에 따라 204를 사용해도 된다.
Q. HTTP 메서드의 실제 구현은 백엔드 단에서 개발자가 어떻게 구현하느냐에 달려있다. HTTP 메서드는 관례적으로 사용되니, 클라이언트 개발자와 백엔드 개발자가 소통할 때 기존에 약속된 기능 스펙대로 백엔드 단에서 구현하는것이 바람직하다는 것으로 이해하면 되는가?
-> 맞다. HTML Form을 통한 처리는 GET,POST만 지원한다. 따라서 GET으로 삭제처리를 하거나, POST로 수정처리를 하는 등 메서드의 정의와 맞지않게 사용하는 경우도 있다.
Q. POST와 PUT 모두 리소스가 없으면 생성할 수 있는데, 이 둘의 차이점은 무엇인가?
-> POST는 리소스의 생성, PUT은 리소스의 대체를 의미한다.
1. POST는 클라이언트가 서버에 요청을 보낼 때마다 새로운 리소스를 생성하고, 생성한 리소스의 아이디를 반환한다. 그래서 같은 요청을 반복하면 리소스 아이디가 새롭게 바뀐다
-> 클라이언트가 POST /members를 요청할 때마다 생성되는 리소스는 /members/1, /members/2 이런식으로 계속 바뀐다.
2. PUT은 처음 리소스가 없다면 새로 생성한 리소스 아이디를 반환하고, 이후에 계속 같은 요청을 보내면 처음 생성했던 리소스의 아이디만 반환한다. 그래서 같은 요청을 반복해도 리소스 아이디는 같다.
-> 클라이언트가 PUT /members/100을 요청할 때마다 /members/100이 반환된다.