HTTP API를 만들어보자
웹 개발자라면 한 번쯤은 RESTful API이라는 문구를 보았을 것이다.
REST API의 이해가 왜 중요한가? 또는 왜 필요할까?라는 생각이 든다.
(REST 규칙은 HTTP의 장점을 최대한 활용할 수 있는 아키텍처입니다.)
현 개발의 가장 중요한 부분은 소통과 협업이다. 우리는 개발을 진행함에 있어 절대로 혼자 코딩하고 혼자 배포하지 않는다.
따라서 나만의 규칙보다는 관례와 규칙이 있다면 따라야 한다.
왜냐하면 나만의 규칙과 습관은 본인은 쉽게 알아볼 수 있겠지만 상대방은 전혀 아니다.
이 부분을 다시 한번 상기하고 HTTP API를 만들어보자.
REST 구성은 다음과 같다.
- 자원(RESOURCE)
- 행위(Verb)
- 표현(Representations)
그렇다면 한번 만들어보자.
- /members/delete/1 (삭제)
- /members/get-list (리스트 조회)
- /members/edit/1 (수정)
- /members/get/1 (조회)
잘 설계된 API처럼 보이는가? 전혀 아니다.
왜? URI는 리소스를 보여 줄 수 있도록 해주는 식별자라고 말했었다.
앞서 예시에는 URI는 자원과 행위가 같이 들어가 있다.
즉 URI에서는 리소스만 식별해야 하므로 다음과 같이 변경해야 한다.
- /members/1 (삭제)
- /members (리스트 조회)
- /members/1 (수정)
- /members/1 (조회)
여기서 의문이 들 수 있다. 행위가 삭제되었으므로 URI 가 똑같은 것은 어떻게 구분할까?
행위의 같은 경우 HTTP 메서드를 통해 분리하여 구분하면 된다.
HTTP 요청 메서드 - GET, POST
앞서 URI는 리소스만 식별하고 동일 URI 구분하기 위해서는 HTTP 메서드를 통해 구분한다고 정리하였다.
그렇다면 어떤 기준으로 어떠한 HTTP 메서드를 사용해야 하는지 알아보자!
GET
- 해당 메서드는 오로지 URI에서 데이터를 가져올 때만 사용해야 한다.
- 멱등성이 보장된다.(메서드가 한 번만 호출되는지 아닌지 10번 이상 호출되는지 중요하지 않다. 결과는 동일해야 함!)
- 서버에 전달할 데이터는 query 파라미터를 통해 전달(메시지 바디를 사용하여 전달할 수 있지만 지원하지 않는 곳이 많아 지양)
- 일반적으로 GET 메서드 요청 만이 기본적으로 캐싱 전략을 사용하며 다른 메서드들은 제외합니다.
- 해당 메서드는 호출해도 리소스에 변경이 일어나지 않음 (Safe 함)
POST
- 해당 메서드는 서버로 데이터를 보내 저장 또는 프로세스 처리에 사용한다.
- 멱등성이 보장되지 않는다.(N 번 호출하면 서버에는 N의 새로운 데이터가 생긴다.)
- 서버에 전달할 데이터는 메시지 바디를 통해 전달한다.
- 리소스에 변경이 일어남으로 Safe 하지 않음
HTTP 메서드 - PUT, PATCH, DELETE
PUT
- 요청을 통해 새로운 리소스를 생성하거나 , 대상 리소스를 나타내는 데이터를 대체한다.
- 멱등성을 보장한다.(결과를 대체한다. 따라서 같은 요청을 여러 번 해도 죄종 결과는 같다.)
- 만약 대상 리소스가 없어 새로운 리소스를 생성한 경우 서버에서는 클라이언트에게 201 응답을 제공해줘야 한다.
- 대상 리소스를 나타내는 데이터가 있고 요청에 포함된 자료를 토대로 변경(수정) 이 되었다면 200 또는 204 응답을 제공한다.
- 리소스에 변경이 일어남으로 Safe 하지 않음
PATCH
- 대상 리소스의 부분적인 수정을 할 때 사용한다.
- 멱등성을 보장 할 수도 있고 안 할 수 있다.
- 리소스에 변경이 일어남으로 Safe 하지 않음
- /boards/1/countup 조회수를 증가시키는 요청 n 번 호출할 때마다 조회수도 n 번 증가함 (멱등성 보장하지 않음)
- /members/1/editname 대상 멤버의 이름을 변경하는 것은 여러 번 호출해도 같음 (멱등성 보장)
DELETE
- 대상 리소스를 삭제할 때 사용한다.
- 멱등성을 보장한다.(결과를 삭제함으로 같은 요청을 여러 번 해도 삭제된 결과는 똑같다.)
- 리소스에 변경이 일어남으로 Safe 하지 않음
참고자료
'HTTP > 모든 개발자를 위한 HTTP 웹 기본 지식' 카테고리의 다른 글
HTTP 상태코드 (0) | 2021.04.27 |
---|---|
HTTP 메소드 활용 (0) | 2021.04.22 |
HTTP 기본 (0) | 2021.04.13 |
URI와 웹 브라우저 요청 흐름 (0) | 2021.04.13 |
인터넷 네트워크(TCP,UDP,PORT,DNS) (0) | 2021.04.08 |