http 메서드
◎ http 메서드
-> 서버에서 api와 uri를 설계한다고 하고, 회원 목록 조회, 회원 등록, 회원 수정, 회원 삭제 기능에 대해 설계를 한다면 설계 시 가장 중요한 것은 리소스를 식별하는 것이다.
-> 여기에서 리소스는 회원이라는 개념 자체이다.
-> 조회, 등록, 수정, 삭제는 행위이며 리소스인 회원과 행위는 분리하여 설계해야 한다. 따라서 회원이라는 리소스만 식별을 하면 된다.
-> uri는 리소스만 식별을 하고, 이 행위(메서드)들을 구분하는 것은 http 메서드가 한다.
-> http 메서드의 종류로 GET, POST, PUT, PATCH, DELETE가 있다.
◎ GET
-> 리소스를 조회한다.
-> url에 있는 자원을 달라고 요청하는 것이다. 클라이언트에서 요청을 받으면 서버에서 그에 맞는 데이터를 조회하여 응답 메시지를 만들어 클라이언트에 보낸다.
-> 서버에 전달하고자 하는 데이터는 query(쿼리 파리미터, 쿼리 스트링)을 통해 전달한다.
-> 메시지 바디를 이용하여 전달할 수도 있지만 지원하지 않는 경우도 있다.
◎ POST
-> 요청 데이터를 처리한다.
-> 메시지 바디를 통해 서버로 요청 데이터를 전달한다 그러면 서버는 요청 데이터를 처리를 한다.
-> 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용된다.
-> 클라이언트에서 메시지를 전달하면 서버에서 신규 식별자를 생성하고 요청 데이터를 처리하여 응답 메시지를 보낸다.
-> post는 새 리소스를 생성할 때, 요청 데이터를 처리할 때, 다른 메서드를 처리하기 어려운 경우 사용한다.
-> 리소스 URI에 POST 요청 시 요청 데이터를 어떻게 처리할지 리소스 별로 지정해야 한다.
-> 데이터 생성이나 수정을 넘어 프로세스 자체를 처리해야 하는 경우에 사용한다.(ex : 결제완료 -> 배달시작 -> 배달완료)
-> POST의 결과가 항상 새로운 데이터의 저장은 아니다.
-> 다른 HTTP 메서드로 요청을 처리하기 어려운 경우에도 사용한다. (ex : JSON으로 조회 데이터를 넘기는 경우 GET을 사용하면 메시지 바디를 허용하지 않는 경우가 있어 이런 경우 POST 요청으로 조회용 데이터를 넘겨 데이터를 응답 받을 수 있다.)
◎ PUT
-> 리소스를 대체하는 것이다.
-> 리소가 없으면 새로 생성하고, 있다면 기존의 것을 지우고 새로운 리소스로 완전히 덮어쓴다.
-> 만역 /members/100이라고 서버에 보냈는데, 리소스가 없다면 신규로 생성하고, 있다면 기존의 것을 없애고 덮어써서 완전히 대체한다.
▶ POST vs PUT
-> PUT과 POST의 차이점은 PUT은 클라이언트가 구체적인 리소스 경로를 알고 있다는 것이다. 즉, 클라이언트가 리소스를 식별을 한다. 반면 POST는 클라이언트에서 요청을 하면 서버에서 리소스 경로를 생성한다.
-> 또한 만약 서버 리소스에 a,b필드가 존재하고, 클라이언트에는 b필드만 존재하는 상황에서 PUT메서드를 실행하면 서버 리소스에는 b필드만 남게 된다. PUT은 리소스를 완전히 대체하는 것이기 때문에 리소스의 전체를 모두 바꾸게 된다.
◎ PATCH
-> PUT은 리소스 전체를 변경하기 때문에 부분적으로는 수정이 불가능하다. 부분 수정을 할 때 PATCH를 사용한다.
-> 위 그림은 PATCH를 이용해 age필드만 부분 변경한 것이다. 만약 PATCH가 아니라 PUT였다면 username필드도 사라지고 age:29만 남게 되었을 것이다.
◎ DELETE
-> 리소스를 제거한다.
◎ HTTP 메서드 속성
-> http 메서드의 속성으로 안전, 멱등, 캐시 가능이 있다.
▶ 안전
-> 호출을 해도 리소스를 변경하지 않는 것이다.
-> 여러 번 호출을 했을 때 뭔가 변경이 발생하지 않는다면 안전한 것이고, 변경 사항이 있다면 안전하지 않은 것이다.
▶ 멱등
-> 몇 번을 호출하던 항상 같은 결과를 나타내는 것이다.
-> GET은 멱등이다. 여러 번을 조회해도 항상 같은 결과가 조회되기 때문이다.
-> PUT은 멱등이다. PUT을 이용하면 결과를 완전히 대체하기 때문에 여러 번 요청해도 결국 결과는 같게된다.
-> DELETE는 멱등이다. 여러 번 DELETE를 하면 항상 리소스가 삭제되는 결과가 발생하기 때문이다.
-> POST는 멱등이 아니다. 만약 결제를 하는 기능을 두 번 호출을 하면 결제가 중복되기 때문에 문제가 발생한다.
-> 멱등은 자동 복구 메커니즘에 사용된다. 무언가를 호출을 했는데 서버에서 응답이 없다면 클라이언트가 다시 호출을 하는 경우에 활용된다. 서버에서 요청에 대한 응답이 없어서 클라이언트를 다시 호출을 해도 결과에는 변경 사항이 없어야 하기 때문이다.
-> 멱등은 외부 요인으로 중간에 리소스가 변경되는 것 까지는 고려하지 않는다.(ex 재요청 중간에 다른 곳에서 리소스를 변경하는 경우)
▶ 캐시 가능
-> 응답 결과 리소스를 *캐시해서 사용해도 되는 경우다.
* 캐시 : 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다.
(https://ko.wikipedia.org/wiki/%EC%BA%90%EC%8B%9C)
-> 만약 웹 브라우저에 큰 이미지를 요청을 한다고 가정하면, 이 후에 똑같은 이미지를 또 사용하게 될 때 다시 요청하는 것이 아니라 웹 브라우저에 내부에 이미지를 저정하여 필요할 때 다시 사용하면 된다.
★ 참고 및 출처
모든 개발자를 위한 HTTP 웹 기본 지식
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard