HTTP

6. HTTP 메서드 활용 (2)

zuun 2022. 7. 28. 21:17

HTTP API에서 POST와 PUT 모두 새로운 내용을 등록할 수 있다.

그렇다면, 언제 POST를 사용하고 언제 PUT을 사용해야 할까?


HTTP API 설계

● POST 기반 설계

● 회원 목록 : /members -> GET

회원 등록 : /members -> POST

회원 목록 조회와 등록이 모두 같은 URI를 사용하는데 어떻게 구분하지 ?

앞선 포스트에서도 말했듯이, 서버와의 임의의 약속을 한다.

따라서, 전달된 메서드에 맞게 동작하도록 설계하면 된다.

POST 메서드를 넘길 경우, Resource를 구분할 수 있는 추가적인 URI를 서버에서 생성

※ 클라이언트는 새롭게 등록되는 Resource의 URI를 모른다.

이와 같이 서버가 관리하는 Resource Directory를 컬렉션이라고 부른다. (/members)

회원 조회 : /members/{id} -> GET

회원 수정 : /members/{id} -> PATCH, PUT, POST

회원 삭제 : /members/{id} -> DELETE

● Put 기반 설계

● 파일 목록 : /files -> GET

파일 조회 : /files/{filename} -> GET

파일 등록 : /files/{filename} -> PUT

PUT 메서드는 기존 Resource가 있을 경우, 이를 "완전 대체"하고 없을 경우, 새롭게 생성한다.

따라서, 파일 등록시에는 POST보다는 완전 대체되는 PUT 메서드가 더 적합하다.

파일 삭제 : /files/{filename} -> DELETE

파일 대량 등록 : /files -> POST

POST 기반 설계와 달리, PUT 메서드를 사용하기 위해서는 특정 filename을 알고 있어야 한다.

즉, 클라이언트가 Resource의 URI를 알고 있어야 한다. 따라서 직접 URI를 지정해주어야 한다.

이와 같이, 클라이언트가 관리하는 Resource Repository를 스토어라고 한다. (/files)

 

대부분, POST 기반 설계의 컬렉션을 주로 사용한다.

 

● HTML Form을 사용한 POST 기반 설계

• 회원 목록 /members -> GET
• 회원 등록 폼 /members/new -> GET

Form을 Load하기 위해서는 GET 메서드를 사용하는 것이다.

• 회원 등록 /members/new, /members -> POST
• 회원 조회 /members/{id} -> GET
• 회원 수정 폼 /members/{id}/edit -> GET
• 회원 수정 /members/{id}/edit, /members/{id} -> POST
• 회원 삭제 /members/{id}/delete -> POST

앞서 설명했듯이, HTML Form은 GET, POST 메서드만 사용 가능하다.

따라서, 회원 삭제 등을 구현하기 위해서는 delete를 사용할 수 없다.

이럴 경우, 컨트롤 URI와 POST 메서드를 결합하여 사용하여야 한다. (동사로 된 Resource 경로를 사용)

* /new, /edit, /delete 등이 컨틀로 URI