(인프런) 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식을 공부하고 리뷰한 글입니다.
3. PUT, PATCH, DELETE
1. PUT
리소스 대체
- 리소스가 있으면 대체(덮어씀)
- 리소스가 없으면 생성
(중요!) 클라이언트가 리소스를 식별
- 클라이언트가 리소스 위치를 알고 URI 지정(POST와 차이점)
- POST) /members :→ 클라이언트는 리소스 위치 모름
- PUT) /members/100 → 클라이언트는 리소스 위치 알고 URI 지정
2. PUT 동작 과정
PUT은 리소스가 있으면 대체, 없으면 생성하는 2가지 경우가 존재한다.
<리소스가 있는 경우>
1) 리소스 대체1 - 메시지 전달
클라이언트가 /members/100에 리소스를 대체하기 위해 PUT 방식으로 HTTP 요청 메시지를 서버에 보낸다.
2) 리소스 대체2 - 리소스 대체
서버에 /members/100 이 있으면, HTTP 요청 메시지의 message-body에 있는 데이터로 리소스가 대체된다.
<리소스가 없는 경우>
1) 리소스 대체1 - 메시지 전달
클라이언트가 /members/100에 리소스를 대체하기 위해 PUT 방식으로 HTTP 요청 메시지를 서버에 보낸다.
2) 리소스 대체2 - 신규 리소스 생성
서버에 /members/100 이 있으면, HTTP 요청 메시지의 message-body에 있는 데이터로 신규 리소스가 생성된다.
3. PUT은 리소스를 완전히 대체한다!
1) 리소스를 완전히 대체한다1
age의 값만 변경하기 위해 message-body에 username은 빼고 변경할 age 값만 담아서 보낸다.
2) 리소스를 완전히 대체한다2
리소스를 덮어쓰기 때문에, message-body에 있는 age 값만 들어가고 username 필드가 삭제된다.
4. PATCH
리소스 부분 변경
4. PATCH 동작 과정
1) 리소스 부분 변경1
age의 값만 변경하기 위해 message-body에 username은 빼고 변경할 age 값만 담아서 보낸다.
2) 리소스 부분 변경2
리소스를 부분 변경하기 때문에, message-body에 있는 age 값만 변경된다.
5. DELETE
리소스 제거
6. DELETE 동작 과정
1) 리소스 제거1
클라이언트가 /members/100에 있는 리소스를 삭제하기 위해 서버에 DELETE 방식으로 HTTP 요청 메시지를 보낸다.
2) 리소스 제거2
서버는 /members/100에 있는 리소스를 제거한다.
<정리>
- PUT은 완전히 리소스를 대체(덮어씀)할 때 사용하고 PATCH는 리소스를 부분 변경할 때 사용한다!!
- 요청받은 리소스(URI)가 없을 때, PUT은 신규 리소스를 생성해주지만, PATCH는 리소스가 없다는 오류가 발생해야한다.
- PUT /members/100 요청 → /members/100이 없으면 members/100 생성
- PATCH /members/100 요청 → members/100이 없다는 오류 발생
(참고) 요즘에는 PATCH가 거의 다 지원이 되지만 혹시나 PATCH가 지원되지 않으면, POST를 사용한다.
4-3. PUT, PATCH, DELETE 질문 정리
Q. 회원 정보를 수정할 때, PATCH를 사용하면 변경되는 필드가 무엇이냐에 따라 코드를 다 따로 작성해야하기 때문에 중복되는 코드가 많아지므로 PUT으로 전체를 덮어쓰게끔 했다. 만약에 PATCH를 사용한다면, 어떤 식으로 구현해야 좋은 코드를 짤 수 있을까?
A. update 쿼리를 동적 쿼리가 되도록 구성하면 된다.
예를 들어, 클라이언트에서는 변경된 값만 서버에 넘기고, 서버에서는 필드에 값이 있는 경우에는 update set 조건으로 추가하고, 값이 null인 경우에는 update set 조건에서 제외하는 식으로 만들면 된다.
(참고) 동적쿼리란 특정 조건이나 상황에 따라 쿼리가 변경되어야 하는 경우를 말한다.
[출처] https://www.inflearn.com/questions/117477
Q. 클라이언트가 /memebers/100 에 다음과 같이 리소스를 담아 FETCH 메시지를 서버에 전달했고 서버의 리소스는 다음과 같다면 어떻게 될까?
클라이언트 { C:"ccc" }, 서버 { A:"aaa", B:"bbb" }
A. 이는 서버에서 결정할 문제로 2가지 경우로 나누어 생각해볼 수 있다.
1) 서버에 없는 필드의 값도 다 받아주도록 설계한 경우
서버에 { A:"aaa", B:"bbb", C:"ccc" } 로 리소스 저장
2) 서버에 없는 필드의 값은 받아주지 않도록 설계한 경우
400 오류 발생
[출처] https://www.inflearn.com/questions/128539
Q. 실무에서 DELETE의 응답 메시지(status code)를 어떻게 처리하는가?
A. 대부분 200을 사용하고 상황에 따라 204를 사용해도 된다.
[출처] https://www.inflearn.com/questions/169816
Q. HTTP 메서드의 실제 구현은 백엔드 단에서 개발자가 어떻게 구현하느냐에 달려있다. HTTP 메서드는 관례적으로 이렇게 구현하는게 바람직하다는 것으로 이해하면 되는가?
A. HTML Form 전송을 통한 처리는 GET, POST 만 지원한다.
따라서 GET으로 삭제 처리를 하거나, POST로 수정 처리를 하는 등 메서드의 정의와 맞지않게 사용하는 경우도 있다.
[출처] https://www.inflearn.com/questions/277152
Q. POST와 PUT 모두 리소스가 없으면 생성할 수 있는데, 이 둘의 차이점은 무엇인가?
A. POST는 리소스의 생성, PUT은 리소스의 대체를 의미한다.
1) POST는 클라이언트가 서버에 요청을 보낼 때마다 새로운 리소스를 생성하고 생성한 리소스의 아이디를 반환한다. 그래서 같은 요청을 반복하면 리소스 아이디가 새롭게 바뀐다.
- 클라이언트가 POST /members 를 요청할 때마다 생성되는 리소스는 /members/1, /members/2 이런식으로 계속 바뀐다.
2) PUT은 처음 리소스가 없다면 새로 생성한 리소스 아이디를 반환하고, 이후에 계속 같은 요청을 보내면 처음 생성했던 리소스의 아이디만 반환합니다. 그래서 같은 요청을 반복해도 같은 리소스 아이디는 같다.
- 클라이언트가 PUT /members/100 을 요청할 때마다 /member/100이 반환된다.
'Spring > 모든 개발자를 위한 HTTP 웹 기본 지식' 카테고리의 다른 글
[모든 개발자를 위한 HTTP 웹 기본 지식] 05. HTTP 메서드 활용 - 클라이언트에서 서버로 데이터 전송 (0) | 2022.05.30 |
---|---|
[모든 개발자를 위한 HTTP 웹 기본 지식] 04. HTTP 메서드 - HTTP 메서드의 속성 (0) | 2022.05.30 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 04. HTTP 메서드 - GET, POST (0) | 2022.05.29 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 04. HTTP 메서드 - HTTP API를 만들어보자 (0) | 2022.05.27 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 03. HTTP 기본 - HTTP 메시지 (0) | 2022.05.27 |