현재 포스팅은 영한님의 HTTP 강의를 바탕으로 작성한 포스팅입니다 :)
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard
모든 개발자를 위한 HTTP 웹 기본 지식 - 인프런 | 강의
실무에 꼭 필요한 HTTP 핵심 기능과 올바른 HTTP API 설계 방법을 학습합니다., [사진] 📣 확인해주세요!본 강의는 자바 스프링 완전 정복 시리즈의 세 번째 강의입니다. 우아한형제들 최연소 기술
www.inflearn.com
HTTP URI 설계
회원 정보 관리 API를 설계한다고 가정해보겠습니다.
위 경우는 좋지 않는 설계입니다. 기본적으로 URL의 경우 리소스 식별을 기준으로 설계를 하는것이 바람직합니다.
즉 위와 같이 회원을 등록 및 수정하고, 조회하는 작업을 동사로 표현하는 것이 아닌 회원이라는 리소스 자체를 URI에 매핑하는 것입니다.
참고로 계층 구조 상 상위를 컬렉션으로 보고 복수단어 사용을 권장합니다(member -> members)
위와 같이 설계를 진행하였다면 조회, 등록, 수정, 삭제 각각의 URI를 어떻게 구분해야 할까요??
이는 HTTP Method를 통해 구분을 하게 됩니다. 즉 리소스만 식별해 놓으면 메서드들이 행위를 대신 해준다고 이해하시면 좋을것 같습니다 :)
HTTP 메서드
HTTP 메서드는 클라이언트가 서버에 요청을 할때 기대하는 행동을 나타냅니다. 이는 크게 GET, POST, PUT, PATCH, DELETE로 나눌수 있습니다.
GET
GET은 리소스를 조회할때 사용하는 메서드입니다.
GET 사용시, 서버에 전달하고 싶은 데이터는 쿼리 파라미터를 통해서 전달을 합니다. 쿼리 파라미터는 리소스 경로 뒤에 ? 문자를 붙여 시작하여, Key-Value 형태로 데이터를 전송합니다. 추가적인 데이터는 & 문자로 이어줍니다.
쿼리 파라미터로 데이터를 전송하게 되면 URL에 데이터가 그대로 노출되기 때문에 보안에 취약합니다. 따라서 보통 쿼리 파라미터로 데이터를 전송할땐 보안에 민감하지 않은 내용을 포함시킵니다.
POST
POST는 주로 데이터의 등록 및 처리를 위해 사용됩니다. 메세지 바디를 통해 서버로 요청 데이터를 전달하고, 전달된 데이터로 신규 리소스를 등록하거나, 프로세스 처리에 사용합니다.
POST의 동작은 그 명칭만으로 한정되지 않습니다. 실제로 POST의 특정 동작은 서버나 해당 리소스에 따라 달라질 수 있습니다. 즉 어떤 데이터를 어떻게 처리할지는 서버의 구현에 따라 결정되며, POST 메서드 자체에는 구체적인 동작이 정해져 있지 않습니다. 또한 클라이언트는 등록될 리소스의 URI를 모른다는 특징을 가집니다.(이후 Location 헤더에 신규 리소스 식별자(ex: members/100)를 보내줌)
정리하자면 새로운 데이터를 등록하거나 요청 데이터를 처리할 때, 또는 다른 메서드로 처리하기 애매한 경우 POST를 사용하면 됩니다.
PUT
PUT은 리소스를 완전히 대체하는 메서드입니다. 요청 데이터에 해당하는 리소스가 존재하면 대체하고 없다면 새로 생성합니다.
중요한 점은 요청 시 클라이언트가 리소스를 알고있다는 점입니다. 클라이언트가 PUT 메서드로 요청을 보낼때 리소스의 경로를 알고 URL을 지정합니다. 어떤 데이터를 대체할지를 알아야 요청을 보낼 수 있겠죠?? POST 메서드의 경우엔 클라이언트가 등록될 리소스의 경로를 모른다는 점에서 차이가 있습니다.
또한 POST와 PUT의 경우엔 멱등성(몇번을 요청 보내도 결과가 같은 경우)에서 차이를 가집니다.
제가 개발을 하다가 PUT에서 POST로 수정한 케이스가 있는데 혹시 참고하고 싶다면 아래 링크를 클릭해주세요 :)
https://wookjongbackend.tistory.com/42
재고 추가하기 - POST(멱등성 x), 비관적 락,낙관적 락
이번 포스팅에서는 이커머스 프로젝트에서 상품의 재고 추가를 위해 제가 구현한 메서드에 대해 간단히 살펴보겠습니다! 혹시 비관적 락(Pessimistic Lock)과 낙관적 락(Optimistic Lock)에 대해 처음 들
wookjongbackend.tistory.com
PATCH
PATCH는 리소스를 부분적으로 대체하는 메서드입니다. 기능적으로는 PUT과 유사하지만 PUT은 기존 데이터를 완전히 대체하고, PATCH는 요청 데이터만 부분적으로 변경합니다.
위의 PATCH 메서드 동작 그림과 함께 PUT과 PATCH의 차이에 대해 이해해보겠습니다!
예를들어 member/100 리소스에 username : young, age : 20이라는 데이터가 저장되어 있다고 가정해보겠습니다.
PATCH 메서드로 해당 리소스 경로에 "age":50 데이터를 보내면 age 필드의 값만 변경되기 때문에 최종적으로 username:young, age:50의 데이터를 가지게 됩니다.
반면 PUT 메서드는 방금과 같은 상황에서 기존 리소스를 완전히 대체하기 때문에 age:50의 데이터만 남게 되고, 기존의 username 필드는 삭제됩니다.
DELETE
DELETE는 요청 리소스 경로의 데이터를 삭제하는 메서드입니다.
HTTP 메서드의 속성
HTTP 메서드의 속성은 안전(Safe Methods), 멱등(Idempotent Methods), 캐시 가능(Cacheable Methods) 관점에서 나뉩니다.
안전이라는 말은 해당 HTTP 메서드가 서버의 자원에 대해 읽기 전용 작업을 수행한다는 것을 의미합니다. 다시 말해, 해당 요청이 서버의 데이터나 상태를 변경하지 않는다는 것을 보장합니다.
멱등이라는 용어는 동일한 요청을 여러번 보내더라도 결과가 항상 동일하게 유지된다는 것을 의미합니다. 예를 들어, 사용자가 동일한 DELETE 요청을 두번 보내도, 첫번째 요청에서 해당 자원이 삭제되었다면 두 번째 요청에서는 아무런 추가 작업이 발생하지 않습니다.
하지만 이러한 멱등은 외부 요인으로 중간에 리소스가 변경되는 것 까지는 고려하지 않습니다.
캐시 가능하다는 것은 해당 메서드의 응답 결과를 캐시하여 후속 요청에 재사용할 수 있다는 것을 의미합니다. 캐시된 응답을 사용하면 서버에 부담을 줄이고 응답시간을 개선할 수 있습니다. GET과 HEAD는 캐시 가능한 메서드로 자주 사용됩니다.
'네트워크 > 영한님 강의 - HTTP 웹 기본 지식' 카테고리의 다른 글
HTTP 상태 코드들에 대해 알아보자! (0) | 2023.08.19 |
---|---|
HTTP란 무엇일까?(클라이언트-서버, stateless, connectionless, 메세지) (0) | 2023.08.19 |
URI와 웹 브라우저 요청 흐름 (0) | 2023.08.17 |
인터넷 네트워크(인터넷 통신, IP, TCP&UDP, PORT, DNS) (0) | 2023.08.15 |