REST에 대한 설명과 특징
1. REST란?
REST는 Representational State Transfer라는 용어의 약자로 www(월드 와이드 웹)과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍쳐의 한 형식. 2000년 박사학위 논문에서 로이필딩이 소개했다.
엄격한 의미로 REST는 네트워크 아키텍쳐 원리의 모음이다. 여기서 ‘네트워크 아키텍쳐 원리’란 자원을 정의하고 자원에 대한 주소를 지정하는 방법 전반을 일컫는다.
필딩의 REST원리를 따르는 시스템을 종종 RESTful이란 용어로 지칭된다.
2. REST 특징
2-1. REST 아키텍쳐에 적용되는 6가지 제한 조건
1) 클라이언트/서버 구조
일관적인 인터페이스로 분리되어야 한다.
2) 무상태(Stateless)
각 요청 간 클라이언트의 콘텍스트가 서버에 저장되어서는 안된다.
3) 캐시처리가능(Cacheable)
WWW에서와 같이 클라이언트는 응답을 캐싱할수 있어야 한다.
잘 관리되는 캐싱은 클라이언트-서버 간 상호작용을 부분적으로 또는 완전하게 제거하여 scalability와 성능을 향상시킨다.
4) 계층화(Layered System)
클라이언트는 보통 대상 서버에 직접 연결되었는지, 또는 중간 서버를 통해 연결되었는지를 알 수 없다. 중간 서버는 로드 밸런싱 기능이나 공유 캐시 기능을 제공함으로써 시스템 규모 확장성을 향상시키는 데 유용하다.
5) Code on demend(optional)
자바 애플릿이나 자바스크립트의 제공을 통해 서버가 클라이언트가 실행시킬 수 있는 로직을 전송하여 기능을 확장시킬 수 있다.
6) 인터페이스 일관성
아키텍처를 단순화시키고 작은 단위로 분리(decouple)함으로써 클라이언트-서버의 각 파트가 독립적으로 개선될 수 있도록 해준다
2-2. REST 인터페이서 원칙에 대한 가이드
1) 자원의 식별
요청 내에 기술된 개별 자원을 식별할 수 있어야 한다. 웹 기반의 REST 시스템에서의 URI의 사용을 예로 들 수 있다. 자원 그 자체는 클라이언트가 받는 문서와는 개념적으로 분리되어 있다. 예를 들어, 서버는 데이터베이스 내부의 자료를 직접 전송하는 대신, 데이터베이스 레코드를 HTML, XML이나 JSON 등의 형식으로 전송한다.
2) 메시지를 통한 리소스의 조작
클라이언트가 어떤 자원을 지칭하는 메시지와 특정 메타데이터만 가지고 있다면 이것으로 서버 상의 해당 자원을 변경·삭제할 수 있는 충분한 정보를 가지고 있는 것이다.
3) 자기서술적 메시지
각 메시지는 자신을 어떻게 처리해야 하는지에 대한 충분한 정보를 포함해야 한다. 예를 들어 MIME type과 같은 인터넷 미디어 타입을 전달한다면, 그 메시지에는 어떤 파서를 이용해야 하는지에 대한 정보도 포함해야 한다. 미디어 타입만 가지고도, 클라이언트는 어떻게 그 내용을 처리해야할 지 알 수 있어야 한다. 메시지를 이해하기 위해 그 내용까지 살펴봐야 한다면, 그 메시지는 자기서술적이 아니다.
4) 애플리케이션의 상태에 대한 엔진으로서 하이퍼미디어
만약에 클라이언트가 관련된 리소스에 접근하기를 원한다면, 리턴되는 지시자에서 구별될 수 있어야 한다. 충분한 콘텍스트 속에서의 URI를 제공해주는 하이퍼텍스트 링크의 예를 들 수 있겠다.
3. REST API 가이드
3-1. 규칙/주의사항
1) URI는 정보의 자원을 표현
GET /posts/delete/1 (x)
자원을 표현하는데 중점을 두어야 한다. delete같은 표현이 들어가면 안된다.
2) 자원에 대한 행동은 HTTP Method로
POST /posts/1
GET /posts/1
DELETE /posts/1
POST, GET, PUT, DELETE 4가지의 Method를 이용해 CRUD를 수행
CRUD란 대부분의 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create, Read, Update, Delete를 묶어서 일컫는 말이다. 사용자 인터페이스가 가져야할 기능을 가리키는 용어로서도 사용된다.
METHOD | 역할 |
---|---|
POST | 해당 URI를 요청하면 리소스 생성 |
GET | 해당 리소스 조회 |
PUT | 해당 리소스 수정 |
DELETE | 해당 리소스 삭제 |
3) 슬래시(/)는 계층관계를 나타낼 때 사용
/member/someone1
4) URI 마지막 문자로 슬래시(/)를 포함하지 않음
/post/add/ (x)
/post/add (o)
REST API는 분명한 URI를 만들어 통신해야 하기 때문에 혼동을 주지 않도록 경로의 마지막에는 슬래시(/)를 사용하지 않는다.
5) 언더바(_)는 사용하지 X
가려 안보이거나 보기 어려울수가 있어 가독성을 위해 하이픈(-)을 사용합니다.
6) URI 경로에는 소문자가 적합
대문자 사용을 피해야 한다. 대소문자에 따라 다른 리소스로 인식하기 때문이다.
7) 파일 확장자는 URI에 포함 하지 않는다
posts/add/img1.jpg (x)
4. HTTP 응답 상태 코드
1) 1XX
요청을 받았고 작업을 진행 중이라는 의미. HTTP/1.0 이후 정의되지 않았다. 서버들도 클라이언트에게 이 코드를 보내지는 않는다. 단 101의 경우 WebSocket등에서 쓰인다.
상태코드 | |
---|---|
100 continue | |
101 switching protocols | |
102 processing |
2) 2XX
이 작업을 성공적으로 받았고, 이해했으며 받아들여졌다는 의미. 200, 206을 제외하면 볼 일이 거의 없는 코드들.
상태코드 | 설명 |
---|---|
200 OK | 성공적으로 처리 |
201 Created | 요청이 성공적을 처리되어서 리소스 만들어졌음을 의미 |
202 Accepted | 서버가 요청을 접수했지만, 아직 처리하지 않음 |
203 Non-Authoritaitive | 서버가 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공중 |
204 No Content | 서버가 요청을 성공적으로 처리했지만 컨텐츠를 저장하지 않는다 |
205 Reset Content | 서버가 요청을 성공적으로 처리했지만 컨텐츠를 표시하지 않는다/204와 다르게 이 응답은 요청자가 문서 보기를 재설정할 것을 요구 |
206 Partial Cotnent | 서버가 GET 요청의 일부만 성공적으로 처리 |
3) 3XX
이 요청을 완료하기 위해서는 리다이렉션이 이루어져야 한다는 의미. 짧은 주소서비스의 경우 접속시 301이나 302 코드를 보내고, 헤더의 locationdp 리다이렉션할 실제 URL을 적어보낸다.
상태코드 | 설명 |
---|---|
300 Multiple Choices | 서버가 요청에 따라 여러 조치를 선택할 수 있다 |
301 Moved Permanently | 영구적으로 컨텐츠가 이동했을 때 쓴다 |
302 Found | 다른 페이지로 이동하지만, 나중에 바뀔수 있다 |
303 See Other | 요청자가 다른 위치에 별도의 GET 요청을 하여 응답을 검색할 경우 서버는 이 코드를 표시 |
304 Not Modified | 200 다음으로 많이 볼수 있는 코드/이 경우 브라우저에 캐시되어 있는 버전을 쓴다 |
4) 4XX
클라이언트 오류로, 이 요청은 바르지 않다는 의미이다. 여기서부터 브라우저에 직접 표출된다.
상태코드 | 설명 |
---|---|
400 Bad Requests | 요청 자체가 잘못되었다는 코드 |
401 Unauthorized | 인증이 필요한 리소스에 인증없이 접근 했을때 발생 |
403 Forbidden | 서버가 요청을 거부할 때 발생. 관리자가 해당 사용자를 차단 |
404 Not Found | 찾는 리소스가 없다는 뜻 |
405 Method Not Allowed | PUT이나 DELETE등 서버에서 허용되지 않은 메소드로 요청시 사용하는 코드 |
406 Not Acceptable | 요청은 정상이나 서버에서 받아들일 수 없는 요청/보통 방화벽에 걸리는 경우 이 코드가 반환 |
407 Proxy Authentication Required | 프록시 인증이 필요할 경우 |
408 Request Timeout | 요청중 시간이 초과되었을 때 |
5) 5XX
서버오류로 올바른 요청에 대해 서버가 응답할 수 없다는 의미
상태코드 | 설명 |
---|---|
500 Internal Server Error | 서버에 오류가 발생해 작업을 수행할 수 없을 때/보통 설정이나 퍼미션 문제 |
501 Not Implemented | 서버에 요청을 수행할 수 있는 기능이 없다 |
502 Bad Gateway | 게이트웨이가 잘못되었을 때 |
503 Service Temporarily Unavailable | 서버를 현재 일시적으로 사용할 수 없을때 뜬다/유지보수주이거나, 터졌을 때 발생 |
504 Gateway Timeout | 서버가 게이트웨이나 프록시 역할을 하고 있거나/업스트림 서버에서 제때 요청을 받지 못함 |
520 Unknown Error | 알수가 없는 오류 |