[WEB] RESTful 작성 가이드라인

14 Aug 2024 - juno

#RESTful  #RESTfulAPI 


SsaGeMeogJa 프로젝트를 진행하면서 공부한 RESTful 작성에 대한 가이드라인


서론

API를 설계하면서 항상 내가 설계하고 있는 이것이 맞는것인가에 대해 고민을 해왔었는데 이번 프로젝트를 계기로 어렴풋이 들어왔던 RESTful API 설계에 대해서 공부하게 되었다.

우선 RESTful API는 표준이 없었다. 하지만 수많은 선배개발자들의 경험에 의한 가이드라인들이 있었다.

RESTful API 설계 가이드라인

1. 용어

2. API 엔드포인트

API엔드포인트의 잘못된 예시 (장바구니 - 상품)

이러한 API들은 무수히 많이 생겨날 수 있다. 그리고 동일하거나 유사한 작업을 수행하는 API가 여러개 존재하게 될 수 있다. 그렇게 API 수가 증가할 수록 유지보수가 부담스러워질 수 있다.

올바른 방식

URL에는 리소스만 포함되어야하고 행동이나 동사는 포함되지 않아야한다. 하지만 위의 잘못된 예시에는 리소스 이름과 함께 액션(get, add, update)등이 포함되어있다.

옳은 예: /products → 엔드포인트에 아무런 액션(동작)이 포함되지 않고 리소스만 포함되어있다.

하지만 어떻게 /products 리소스에서 수행할 동작을 서버에 전달할까

이때 HTTP 메서드(GET, POST, DELETE, PUT 등)가 그 역할을 한다. 그래서 URL에는 동사(액션)를 포함할 필요가 없는 것이다.

리소스는 API엔트포인트에서 항상 복수형이어야 하며 리소스의 한 인스턴스에 접근하려는 경우 URL에 ID를 전달한다.

예시

리소스 하위의 리소스가 존재하는 경우

결론: Resource(리소스)에는 복수형 명사를 사용하고 HTTP 메서드를 활용해 해당 리소스에 대해 수행할 동사의 종류를 결정한다. URL은 명사(리소스)+동사(HTTP메소드)인 하나의 문장이다.

3. HTTP 메서드(동사)

HEAD : GET 메서드와 동일하지만, 상태 줄과 헤더만 반환받음.

CONNECT : 요청한 리소스에 대해 양방향 연결을 시작하는 메소드. 터널을 열기 위해 사용.

OPTIONS : 목표 리소스와의 통신 옵션을 설명하기 위해 사용됨. (주로 CORS에서 사용)

TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행.

4. HTTP 응답 상태 코드

https://developer.mozilla.org/ko/docs/Web/HTTP/Status

서버는 클라이언트가 요청한 API에대해 성공 했는지 실패 했는지에 대한 피드백을 주어야한다. HTTP 상태코드는 다양한 시나리오에 대한 설명이 있는 표준화된 코드모임이다. 이는 회사마다, 프로젝트마다 다를 수 있다. 하지만 어느정도 표준은 있다고 한다.

200번대(성공)

요청된 작업이 성공적으로 수신되어 처리된 경우.

300번대(리디렉션)

400번대(클라이언트 오류)

클라이언트가 잘못된 요청을 했을 경우

500번대(서버 오류)

5. 필드 이름 대소문자 규칙

어떤 규칙이든 따를 수 있지만 한 어플리케이션 내에서는 통일된 방식을 사용해아한다. 요청 본문이나 응답 데이터 형식이 JSON이라면 보통 camelCase를 따른다.

6. 검색, 정렬, 필터링, 페이지 번호

이러한 복잡해지는 리소스에 대한 매개변수, 속성 등은 쿼리 매개변수를 활용해준다.

정렬

쿼리 매개변수를 활용한다.

ID에 따라 오름차순으로 정렬된 장바구니 목록을 가져오고자 하는 경우 → [GET] /carts?sort=id_asc

필터링

쿼리 매개변수 활용하여 옵션 전달

1번 장바구니에서 채소만 가져오는 경우 → [GET] /carts/1/products?category=vegetable

검색

1번 장바구니 상품 중 “당근”을 검색하는 경우 → [GET] /carts/1/products?search=당근

페이징

방식1: paga 사용

방식2: 상대위치(offset)과 범위(limit) 사용

7. 버전관리

API를 업그레이드 하게되는 경우 버전을 명시해줄 수 있다.

예시 https://api.myservice.com/**v1**/carts/1/products

8. 기타

부분응답

데이터베이스에 없는 자원에 대한 응답

출처

Web API Design : 개발자에게 사랑받는 API 만들기, by Mimul

RESTful API Designing guidelines - The best practices, Mahesh Haldar