서버로 보낼 요청에서 핵심이 되는 리소스가 무엇인지 파악하자.
'정보를 받아오자.'의 경우 정보 가 리소스 가 될 것이다.
그럼 '받아오자'는 어떻게 URI로 나타내야할까?
이를 해결하기 위해 HTTP 프로토콜에서는 메서드를 지원해 해당 리소스에 대한 동작을 지시할 수 있다.
Method | 설명 |
---|---|
GET | 리소스 조회 |
POST | 리소스 등록 |
PUT, PATCH | 리소스 수정 |
DELETE | 리소스 삭제 |
여기서 유일하게 PUT, PATCH만 2개가 같은 기능을 수행한다고 되어 있을 것이다.
그러나 이 둘은 분명 다르게 동작한다.
이것만 알고 넘어가자.
PUT은 리소스 자체를 그대로 덮어씌워서 수정을 하고
PATCH 는 변경이 일어난 부분만 교체를 하는 방식이다.
name : 'ahn0min
인 프로퍼티가 존재할 경우
PUT 을 통해 age 만을 넘겨주면 기존의 name은 사라지고 age만이 남게된다.
이는 PUT은 객체 자체를 덮어씌워 수정하기 때문이다.
PATCH 를 통해 age 를 넘겨주게 되면 기존의 name 과 age를 모두 가질 것이다.
이는 PATCH는 기존의 값을 그대로 가진채로 변경된 부분만 수정, 추가, 삭제 하기 때문
간략히 코드로 결과를 표시하겠다. 이 때 서버와의 통신에 대한 코드는 빠져있다.
const person = { name : 'ahn0min' };
/*
PUT을 사용한 경우
PUT /person/1
{
age : 10000,
}
*/
console.log(person); // { age : 10000 }
/*
PATCH를 사용한 경우
PATCH /person/1
{
name : "안영민",
age : 200,
}
*/
console.log(person) // { name: '안영민', age : 200 }
호출해도 리소스(자원)을 변경하지 않는다.
-f(f(x)) = f(x)
자동 복구 메커니즘
그런데 조회(GET)을 하고 다른 값으로 데이터를 수정(PUT)한 다음 다시 조회(GET)을 하면 조회(GET)값이 다르지 않나요?
멱등은 중간에 나 자신의 요청 이외의 다른 요청에 의해 결과가 달라지는 경우까지는 포함하지 않는다.
그것까지 고려하면 해당 리소스는 바뀌지도않고 삭제도 안되고 평생 건들일 수 없는 존재가 되어버린다.
동적 데이터 조회
ex) 구글에서 검색을 할 때 검색어가 무엇인지 언어가 무엇인지 등이 필요함으로 쿼리파라미터를 함께 보내준다.
https://www.google.com/search?q="훈민정음"&hl=ko
Form
태그를 사용하여 내부에 input
태그의 value를 입력하고 submint
event가 발생multipart/form-data
Form 태그에서 file을 포함하여 서버로 전달할 경우에 사용한다.application/json
을 주로 사용한다 (거의 표준)POST는 등록될 리소스의 URI(식별자)를 모른다.
서버가 새롭게 등록되는 리소스의 URI를 생성
response의 location에 URI를 같이 담아서 클라이언트로 전송해준다.
예 : 새로운 회원을 등록할 때 회원정보를 담아서 POST 요청을 보내게 되면 서버에서 회원의 아이디를 만들어(URI 관리) 클라이언트에게 리소스의 URI까지 함께 담아 전달해 주는 상황
/members [POST]
PUT은 등록될 리소스의 URI를 알고 있고 그것을 서버로 전달할 때 사용한다.
클라이언트가 새롭게 등록되는 리소스의 URI를 같이 전달한다.
예 : 클라이언트에서 파일을 담아서 업로드 할 경우 해당 파일의 URI를 함꼐 담아 보내주는 상황 서버에서는 클라이언트가 보내준 URI를 통해서 저장을 한다.
클라이언트가 관리하는 리소스 저장소
리소스의 URI를 클라이언트가 알고 관리한다.
POST방식 vs PUT방식
컬렉션 vs 스토어
Form tag의 경우 GET, POST만 사용이 가능하다.