[섹션 5. HTTP 메서드] HTTP API를 만들어보자 & HTTP 메서드 - GET, POST / 인프런 김영한 - 모든 개발자를 위한 HTTP 웹 기본 지식
이번 시간에는 HTTP 메서드에 대해서 알아보고 HTTP API를 만들어보는 시간을 가졌다.
실무에 투입되고, HTTP API 를 처음으로 설계를 한다고 가정해보자.
그 중에서 회원정보관리 API를 만든다고 하자.
그러면 회원 목록 조회, 회원 조회, 회원 등록, 회원 수정, 회원 삭제 가 있을 것이다.
예를 들어서, 위와 같이 회원목록조회를 read-member-list 라고 명칭을 했다고 해보자.
위의 예시는 좋은 설계일까?
API 설계를 할 때, 가장 중요한 것은 리소스 식별 이다.
그렇다면 리소스의 의미는 무엇일까? 회원을 등록하고 수정하고 조회하는 것이 리소스가 아니다.
예를 들면, 미네랄을 캐라 에서 미네랄이 리소스가 되는 것이다.
즉, 회원이라는 개념 자체가 바로 리소스다.
그렇다면 리소스를 어떻게 식별하는게 좋을까?
회원을 등록하고 수정하고 조회하는 것을 모두 배제한다.
회원이라는 리소스만 식별하면 되고, 회원 리소스를 URI에 매핑을 하면 된다.
앞서 언급한 개념을 적용한다면, 이런식으로 될 것이다.
그러면 다음으로 생기는 의문은, 조회, 등록, 수정, 삭제는 동일하게 되어있는데 어떻게 구분을 할까?
그럴 때는 메서드를 활용해서 구분을 할 수 있다.
HTTP 메서드는 클라이언트가 서버에 요청을 할 때, 기대하는 행동이라고 할 수 있다.
GET이면 무언가를 달라, POST는 데이터를 줄테니 등록을 하거나 처리를 해달라 와 같다고 할 수 있다.
추가로, PUT은 클라이언트에서 서버로 리소스를 보내는데, 이 리소스로 대체를 해달라 고 요청하는 메서드이다.
PUT은 파일을 폴더에 넣는 것과 비슷하다. 파일을 폴더에 넣을때, 같은 파일이 없으면 파일이 새로 생기고, 있으면 덮어쓰기가 되는 것과 비슷하다.
PATCH는 리소스를 부분적으로 변경하는 것이다. 예를 들면, 회원의 이름을 바꾸거나, 특정 필드를 바꿀때 사용한다.
DELETE는 리소스를 삭제 요청할 때 쓴다.
이제 메서드를 하나씩 살펴보자.
GET은 리소스를 조회하는 메서드이다.
예를 들면, /search 이런식으로 서버에 자원을 달라고 요청하는 것이다.
서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달한다.
메세지 바디를 사용해서 데이터를 전달할 수 있지만, 서버에서 지원하지 않는 곳이 많아서 권장하지는 않는다고 한다.
POST는 클라이언트에서 서버로 데이터를 보낼 때, 서버에게 이 요청 데이터를 처리해달라고 요청하는 메서드이다.
그래서 메세지 바디를 통해서 서버로 요청 데이터를 전달한다.
그렇게 서버는 요청 데이터를 받고, 데이터를 처리하는 모든 기능을 수행한다.
주로 전달된 데이터로 신규 리소스를 등록하거나, 프로세스 처리 등에서 사용한다.
예를 들어서 배달시작 이라는 요청을 POST로 보내면
POS /orders/{orderId}/start-delivery 에서 start-delivery 와 같이 동사의 URI가 나올 수 있다.
이를 컨트롤 URI라고 한다.
실무에서는 오직 리소스만으로는 다 설계가 불가능하니, 컨트롤 URI를 통해서 설계가 가능하다.
다른 메서드로 처리하기가 애매한 경우가 있는데,
예를 들어서, JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드를 사용하기가 어려운 경우.
왜냐하면 메세지 바디에 데이터를 넘겨야 하는데 GET 메서드를 서버가 지원하지 않는 경우가 있기 때문이다.
이럴 경우에는, POST를 쓰고 메세지 바디에 조회용 데이터를 넘기면 된다.
이렇게 보통 애매하면 POST 방식을 쓰면 된다고 보면 된다.
하지만, 조회할 때는 GET을 하는 것이 유리하다고 한다.
왜냐하면 서버끼리는 GET 요청을 하면 캐싱을 하겠다 라는 약속을 하는데,
POST는 캐싱을 하는 것이 어렵다는 특징이 있다