REST( Representational State Transfer )
。웹을 설계하는 하나의아키텍처 스타일
▶아키텍처 스타일: 제약조건의 집합
。REST 제약조건은 총 6개가 존재하며, 이를 모두 준수해야Restful하다고 할 수 있다.
▶제약조건을 통해 큰 장점들이 존재하여 대부분의웹서비스가 사용하는웹 아키텍처
。자원을자원의 표현으로 구분하여 해당 자원의상태(=정보)를 주고 받는 모든 행위
▶데이터가 요청되는 시점에서자원의상태를JSON을 통해 주고받음
RESTful
。REST API를 제공하는웹서비스를 지칭하는 용어
▶ 암묵적으로REST 제약조건을 준수하는시스템에RESTful이라는 용어를 사용한다
REST의 핵심개념 :자원 / 행위 / 표현
자원(Resource) :
。해당서버가 관리하는 모든것
▶REST API가 다루는 대상으로서 주로명사형태로 표현
( ex: 문서 , 그림 , 데이터 등 일반적으로 교환하는 모든 정보를 포함하여자원이라고 한다.)
。URL를 통해 고유하게 식별하여 위치를 지시
ex )/users
행위(Method)
。자원에 대해 무엇을 수행할 건지 정의
HTTP Method
표현( Representation ) :
。자원을 어떤 형식으로 주고받을 지를 정의
ex )JSON,XML, ....
REST 아키텍처의 장점
。REST는제약조건을 통해 다음 장점들이 존재하여 대부분의웹서비스가 사용
확장성
。REST의Stateless 제약조건을 통해 요청마다 독립적이므로,서버를 쉽게Scale-out하여 증설할 수 있다.
▶로드밸런싱이 쉬운 특징으로대규모 서비스에 적합
유지보수 용이
。REST의Client-Server 제약조건을 통해프론트엔드와백엔드가 완전히 분리되어 서로 영향 없이유지보수가 가능
일관성
。REST의Uniform Interface 제약조건을 통해API 규칙이 통일되어 처음 보는API도 용이하게 해석가능
캐싱 가능
。REST의Cacheable 제약조건을 통해HTTP Cache를 이용하여WAS까지요청할 필요 없이,Cache Server에서 데이터를 쉽게 가져오므로응답성능향상
유연한 구조
。REST의Layered System 제약조건을 통해 중간에프록시 서버 / 로드 밸런서등을 추가해도클라이언트는서버와 통신 시 어떤중간 계층을 거치는지 알 수 없음
REST 아키텍처제약 조건
。REST 제약조건은 총 6개가 존재하며, 이를 모두 준수해야Restful하다고 할 수 있다.
▶Client-Server / Stateless / Cacheable / Layered System/Uniform Interface/Code-On-Demand
。HTTP만 잘 지키더라도Client-Server,Stateless,Cache,Layered System을 모두 준수
▶HTTP 프로토콜을 사용하는 상태에서REST API 설계시Uniform Inteface만 중점적으로 고려
Client-Server
。REST 아키텍처는클라이언트 / 서버로 분리되어야한다.
▶ 。HTTP 프로토콜을 사용하는구조자체가Client - Server Architecture이므로 준수
Stateless
。REST 아키텍처는 이전요청을 기억하지 않아야한다.
▶HTTP 프로토콜은STATELESS특징으로서버에서클라이언트에 대한 정보를 알 수 없으므로 준수
Cacheable
。REST 아키텍처는응답을캐싱할 수 있어야한다.
▶HTTP는Web Cache를 사용하여브라우저에 빠른응답을 지원
Layered System
。REST 아키텍처는 중간에프록시 / 로드밸런서등이 존재할 수 있어야 한다.
。HTTP는클라이언트와서버사이에프록시서버(웹캐시) ,API 게이트웨이등 다양한중간 계층들 간에 서로기능별로 독립되어 분리
▶계층의유지보수시 다른계층에 영향을 주지않음.
▶클라이언트는서버와 통신 시 어떤중간 계층을 거치는지 알 수 없음
Code-on-Demand( 선택 )
。REST 아키텍처는서버에서코드를클라이언트로 전송하여 실행할 수 있도록 한다.
▶ 이는JS를 의미하며 꼭 준수할 필요는 없음.
Uniform Interface
。REST 아키텍처는클라이언트가서버내자원에 접근하는 방식이 일관되도록 해야한다.
▶REST API 설계시 가장 신경 쓸 부분
Uniform Interface
。클라이언트가서버내자원에 접근하는 방식이 일관되도록 하도록 하는 것
▶서버내 다른자원에 접근하더라도 항상 동일한Type(Http Method,URI 구조,Response Format)으로 접근이 가능하도록 하는 것
Identification of Resource
。서버내 모든자원은 고유한URL로 식별되어야함
▶ 명확한비즈니스 모델로 설정
ex )/users/1,/orders/2, ...
Manipulation of resources through representations
。클라이언트에서Representation(JSON,XML, ... )를 전송하여서버 내 자원의 조작(CRUD)이 가능한 것
Self-Descriptive Message
。API의요청과응답은외부 문서없이 스스로 설명할 수 있어야한다.
▶HTTP Message에 표현을 작성하여추가 문서없이HTTP Message자체만으로 의미를 이해해야할 수 있어야하는 능력
Self Descriptive한HTTP Message예시POST /api/index.html HTTP/1.1 Host: example.com Content-Type: application/json-patch+json // Data type 지정 Content-Length: 45 { // Http Message Body 부분 "name": "홍길동", "email": "hong@example.com" }。
목적지 Host:example.com
。요청할 서버내 자원:/api/index.html
。Content-Type 헤더:application/json-patch+json
▶json-patch 명세를 통해HTTP Message Body의변수를 설명
▶ 다음처럼 작성하여메시지 내용으로 온전히 해당메시지를 해석 할 수 있어야한다.
HATEOAS
。REST API는Hypertext-driven되어야한다.
。클라이언트에서REST API를 통해 제공된 다른자원을 지시하는하이퍼링크를 통해어플리케이션의상태를전이
▶Http Message의Link 헤더를 통해 다른자원에 대한하이퍼링크를 제공HTTP/1.1 200 OK Content-Type: application/json Link: </articles/1>; rel="previous", </articles/3>; rel="next";
REST API
。REST 원칙을 따르는API
▶HTTP를 기반으로 하여REST 제약조건을 준수
。웹에서 다른프로그램이자원을 주고받기 위한 표준방식의통신규칙
▶클라이언트와Web Application간자원을 주고받기위한인터페이스
。언어 , 프레임워크 , 기술등에 영향을 받지 않으면서 지정된데이터 형식(JSON,XML)을 통해클라이언트와서버간 데이터 교환이 가능
。HTTP Method를 지원 및HTTP의STATELESS특징을 승계하여서버는클라이언트를 알 수 없다.
▶ 매Request마다인증을 요구.
▶GET, POST, DELETE, PUT, HEAD, PATCH, OPTIONS를 지원
。Spring의REST API는Spring MVC에서@RestController를 통해Controller로서 구축되어요청및응답이 수행
▶@ResponseBody기능 추가
REST API설계
REST API는Hypertext-driven되어야한다
。API에HATEOAS적용
▶클라이언트에서Hyperlink를 통해어플리케이션의상태를 변화
Resource의명사표현 :
。URL은Resource이므로도메인( =비즈니스 모델)으로 지칭하며동사가 아닌명사들로 구성되어야 한다.
▶REST API설계 시단수,복수형을 섞어 사용하지 않으며, 모든Resource에 대해복수형 명사사용!
자원검색 시Path Variable사용 :
。Query String의/getUser?id=1이 아닌@RestController에 의한Path Variable의/users/{id}가 맞는 표현.
▶ 해당자원에 대해추가 질의가 존재하는 경우에만query string을 사용
ex )URI:https://{serviceRoot}/{collection}/{id}
- 적절한
Http Status Code를 반환
。@ResponseStatus 어노테이션을 통해클라이언트가 요청 후 성공 시200을 반환하도록@ResponseBody( code=HttpStatus.OK )설정
HTTP Method의 적절한 사용하여REST : 행위를 표현 :
。REST는 해당요청의 의도를 쉽게 파악 할 수 있도록HTTP Method를 목적에 따라 구분하여 사용.
▶POST /users/1/delete가 아닌DELETE /users/1로 표기.
HTTP Method별Endpoint
。특정Resource를 조작하기 위한URL 패턴
。users는백엔드기준도메인( =비즈니스 모델)인user에서복수로 표현가능하므로 관례적으로users로 설정
。GET /api/users: 모든 사용자 조회
。GET /api/users/{id}: 특정 사용자 조회
。POST /api/users: 새로운 사용자 생성
。PUT /api/users/{id}: 특정 사용자 정보 전체 수정
。PATCH /api/users/{id}: 특정 사용자 정보 일부 수정
。DELETE /api/users/{id}: 특정 사용자 삭제
。GET /api/users/{id}/posts: 특정 사용자와 연결된 모든 게시물 검색
。POST /api/users/{id}/posts: 특정 사용자와 연결된 게시물 생성
。GET /api/users/{id}/posts/{post_id}: 특정 사용자와 연결된 특정 게시물 검색