GOAL
REST의 개념을 이해한다.
REST의 특징도 이해한다.
REST의 설계 기본 규칙과 방법을 이해한다.
RESTful의 개념도 이해한다.
REST (Representational State Transfer)
- 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미한다.
- REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일이다.
- REST는 네트워크상에서 Client와 Server 사이의 통신 방식 중 하나이다.
구체적인 개념
HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(GET, POST, PUT, DELETE)를 통해 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.
REST 6가지 기본 원칙
- Client–server 구조
- 클라이언트와 서버는 서로 독립적이어야 하며, 클라이언트는 오직 URIs 리소스만 알아야한다. 클라이언트와 서버의 인터페이스가 변경되지 않는 한, 이 둘은 독립적으로 개발되거나 대체될 수 있게 유지해야한다. (관심사의 명확한 분리)
- Stateless(무상태성)
- 클라이언트의 모든 요청에는 해당 요청을 이해할 수 있는 모든 정보가 포함되어야한다. 서버는 HTTP 요청에 대한 어떤 것도 저장하지 않는다. 컨텍스트를 유지해야하는 세션, 인증과 인가에 대한 정보 또한 클라이언트에만 보관되며, 각 요청 시 해당 정보를 모두 포함하여 서버에 요청한다.
- Cacheable
- 서버는 Response cache-control 헤더에 해당 요청이 캐싱이 가능한 지에 대한 여부를 제공해야 한다. 이를 제공한다면 클라이언트는 Response를 캐싱하여 서버와 클라이언트 간의 상호작용을 줄이고, 성능과 서버 가용성을 늘릴 수 있다.
- Uniform interface(일관된 인터페이스)
- 보편적인 소프트웨어 엔지니어링 원칙을 component interface에 적용하면, 전체적인 시스템 아키텍처는 단순화되고 각 상호작용에 대한 가시성이 개선된다. 이름 그대로 일관된 인터페이스를 얻기 위해 REST에서는 4가지 인터페이스 규칙을 정의하였다.
- identification of resources : 요청 시 개별 자원을 식별할 수 있어야함
- manipulation of resources through representations : 어떤 자원에 대해 작업하기 위한 적절한 표현과 메타데이터를 충분히 갖추고 있다면, 서버는 해당 자원을 변경, 삭제할 수 있는 정보를 가지고 있단 의미
- self-descriptive messages : 자신을 어떻게 처리해야하는지 정보를 포함해야함
- hypermedia as the engine of application state : 단순히 결과 뿐만이 아니라 결과에 대한 정보를 포함해야 함
- 보편적인 소프트웨어 엔지니어링 원칙을 component interface에 적용하면, 전체적인 시스템 아키텍처는 단순화되고 각 상호작용에 대한 가시성이 개선된다. 이름 그대로 일관된 인터페이스를 얻기 위해 REST에서는 4가지 인터페이스 규칙을 정의하였다.
- Layered system(다중 계층)
- REST는 다중 계층 구조를 가질 수 있도록 허용한다. (예를 들어 API 서버와 DB서버 그리고 인증 서버를 따로 둘 수 있다) 그리고 각 레이어는 자기와 통신하는 컴포넌트 외 레이어에 대해서는 정보를 얻을 수 없다. 클라이언트는 REST 서버와만 상호작용할 뿐, REST가 상호작용하는 레이어나 그 외 중간 레이어들, end server에 직접적으로 요청할 수 없으며 이들의 상호작용 또한 볼 수 없다.
- Code on demand (optional)
- 서버가 클라이언트에서 실행시킬 수 있는 로직을 전송하여 클라이언트의 기능을 확장시킬 수 있다. 이를 통해 클라이언트가 사전에 구현해야하는 기능의 수를 줄여 간소화시킬 수 있다.
REST가 필요한 이유
- 애플리케이션 분리 및 통합
- 다양한 클라이언트의 등장
- 다양한 브라우저와 안드로이드, 아이폰과 같은 모바일 디바이스에서도 통신할 수 있어야 한다.
- 멀티 플랫폼에 대한 지원을 위해 서비스 지원에 대한 아키텍처를 세우고 이용하는 방법을 모색한 결과, REST에 관심을 가지게 되었다.
REST의 장단점
- 장점
- HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구축할 필요가 없다.
- Hypermedia API의 기본을 충실히 지키면서 범용성을 보장한다.
- REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있다.
- 서버와 클라이언트의 역할을 명확하게 분리한다.
- 단점
- 사용할 수 있는 HTTP Method 형태가 제한적이다.
- 구형 브라우저가 아직 제대로 지원해주지 못하는 부분이 있다.
- PUT, DELETE를 사용하지 못하는 점
- 구형 브라우저가 아직 제대로 지원해주지 못하는 부분이 있다.
- 개인적인 의견으로는 행위에 대한 URI 표현이 어렵다고 생각한다.
- URI에 행위에 대한 동사 표현이 들어가면 안된다는게 설계 규칙인데, 동사로만 표현되는 행위들을 어떻게 명사로 표현해야할까
- ex) 서버 자동 배포하는 역할을 하는 API -
POST /server/deploy
- ex) 들어온 값을 복사하는 API -
POST /copy
- 사용할 수 있는 HTTP Method 형태가 제한적이다.
REST 구성 요소
- 자원(Resource) : URI
모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재한다.
Client는 URI를 이용해서 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 Server에 요청한다. - 행위(Verb) : HTTP Method
HTTP 프로토콜은GET, POST, PUT, DELETE
와 같은 메서드를 제공한다. - 표현(Representation of Resource)
Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답(Representation)을 보낸다.
REST에서 하나의 자원은JSON, XML, TEXT, RSS
등 여러 형태의 Representation으로 나타내어 질 수 있다.
그치만 JSON 또는 XML을 통해 데이터를 주고 받는 것이 일반적이다.
REST API 설계 기본 규칙
- URI는 정보의 자원을 표현해야 한다.
- resource는 동사보다는 명사를, 대문자보다는 소문자를 사용한다.
- resource의 도큐먼트 이름으로는 단수 명사를 사용해야 한다.
- resource의 컬렉션 이름으로는 복수 명사를 사용해야 한다.
- resource의 스토어 이름으로는 복수 명사를 사용해야 한다.
- 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
- URI에 HTTP Method가 들어가면 안된다.
- ex)
GET /members/delete/2
->DELETE /members/2
- ex)
- URI에 행위에 대한 동사 표현이 들어가면 안된다.
- ex)
GET /members/show/1
->GET /members/1
- ex)
- 경로 부분 중 변하는 부분은 유일한 값으로 대체한다. (id는 하나의 특정 resource를 나타내는 고유값이다)
- ex) id=1인 student를 삭제하는 route:
DELETE /students/1
- ex) id=1인 student를 삭제하는 route:
- URI에 HTTP Method가 들어가면 안된다.
REST API 설계 규칙
- 슬래시 구분자(/)는 계층 관계를 나타내는데 사용한다.
ex)/houses/rooms
- URI 마지막 문자로 슬래시(/)를 포함하지 않는다.
ex)/houses/rooms
- 하이픈(-)은 URI 가독성을 높이는데 사용
불가피하게 긴 URI 경로를 사용하게 된다면 하이픈을 사용해 가독성을 높인다. - 언더스코어는(_ )은 URI에 사용하지 않는다.
밑줄 때문에 문자가 가려지기도 하므로 가독성을 위해 사용하지 않는다. - URI 경로에는 소문자가 적합하다.
RFC 3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문 - 파일확장자는 URI에 포함하지 않는다.
- REST API에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI안에 포함시키지 않는다.
- Accept header를 사용한다.
- ex) /members/face/1/photo.jpg (X)
- ex) /members/face/1
- 필터를 위해 쿼리 파라미터를 사용한다.
정렬, 필터링, 페이징은 신규 API를 생성하지 않고 쿼리파라미터를 활용한다.
REST API 설계 예시
CRUD | HTTP Method | Route |
---|---|---|
resource들의 목록을 표시 | GET | /resource |
resource들의 하나의 내용을 표시 | GET | /resource/:id |
resource를 생성 | POST | /reource |
resource를 수정 | PUT | /resource/:id |
resource를 삭제 | DELETE | /resource/:id |
resource를 부분 수정 | PATCH | /resource/:id |
상태 코드 요약
- 1XX: 전송 프로토콜 수준의 정보 교환
- 2XX: 클라이언트 요청이 성공적으로 수행됨
- 3XX: 클라이언트는 요청을 완료하기 위해 추가적인 행동을 취해야 함
- 4XX: 클라이언트의 잘못된 요청
- 5XX: 서버쪽 오류로 인한 상태코드
RESTful 개념
RESTful은 일반적으로 REST라는 아키텍쳐를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어이다.
- REST API를 제공하는 웹 서비스를 RESTful하다고 할 수 있다.
- REST 원리를 따르는 시스템은 Restful이란 용어로 지칭된다.
RESTful의 목적
이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것
RESTful API를 구현하는 근본 목적은 성능 향상이 아닌 일관적인 컨벤션을 통한 API의 이해도 및 호환성을 높이는 것이다. 그러니 성능이 중요한 상황에서는 굳이 RESTful한 API를 구현할 필요는 없다.
RESTful하지 못한 경우
- ex) CRUD 기능을 모두 POST로 처리한다.
- ex) route에 resource, id 외의 정보가 들어가는 경우(/students/updateName)
전체 응답코드
응답코드 | 설명 |
---|---|
100 | 계속 |
101 | 스위칭 프로토콜 |
102 | 처리 |
200 | 확인 |
201 | 생성됨 |
202 | 수락됨 |
203 | 신뢰할 수 없는 정보 |
204 | 내용 없음 |
205 | 콘텐츠 재설정 |
206 | 부분 콘텐츠 |
207 | 다중 상태 |
208 | 이미보고 됨 |
226 | IM 사용 |
300 | 다중 선택 |
301 | 영구 이동 |
302 | 발견 |
303 | 기타 확인 |
304 | 수정되지 않음 |
305 | 프록시 사용 |
306 | 스위치 프록시 |
307 | 임시 리디렉션 |
308 | 영구 리디렉션 |
400 | 잘못된 요청 |
401 | 승인되지 않음 |
402 | 결제 필요 |
403 | 금지 |
404 | 찾을 수 없음 |
405 | 허용되지 않는 방법 |
406 | 허용되지 않음 |
407 | 프록시 인증 필요 |
408 | 요청 시간 초과 |
409 | 충돌 |
410 | 사라짐 |
411 | 필요한 길이 |
412 | 전제 조건 실패 |
413 | 페이로드가 너무 큼 |
414 | URI가 너무 김 |
415 | 지원되지 않는 미디어 유형 |
416 | 범위가 만족스럽지 않음 |
417 | 예상 실패 |
418 | 나는 찻주전자(RFC 2324) |
421 | 잘못된 요청 |
422 | 처리 할 수 없는 엔티티 |
423 | 잠김 |
424 | 실패한 종속성 |
426 | 업그레이드 필요 |
428 | 전제 조건 필요 |
429 | 너무 많은 요청 |
431 | 요청 헤더 필드가 너무 큼 |
451 | 법적 이유로 사용할 수 없음 |
500 | 내부 서버 오류 |
501 | 구현되지 않음 |
502 | 잘못된 게이트웨이 |
503 | 서비스를 사용할 수 없음 |
504 | 게이트웨이 시간 초과 |
505 | HTTP 버전이 지원되지 않음 |
506 | 변형도 협상 |
507 | 스토리지 부족 |
508 | 루프 감지 됨 |
510 | 확장되지 않음 |
511 | 네트워크 인증 필요 |
Reference
https://www.restapitutorial.com/httpstatuscodes
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
'Java > Web' 카테고리의 다른 글
[Http Method] PATCH vs PUT 멱등성 보장? 비보장? (0) | 2021.11.22 |
---|