RESTFul API
REST
- 의의
- 정의 : "Representational State Transfer"의 약자(대표적인 상태 전송)
- 자원을 이름으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미
→ 자원의 표현에 의한 상태 전달(자원 : 해당 소프트웨어가 관리하는 모든 것, 표현 : 자원을 표현하기 위한 이름)
→ 데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달
- 분산 하이퍼미디어 시스템을 위한 소프트웨어 개발 아키텍처의 한 형식
→ REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍쳐 스타일
→ Client와 Server의 통신 방식 중 하나 - REST의 구체적인 개념
- HTTP URI를 통해 자원을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당자원에 대한 CRUD 적용하는 것 - REST의 장단점
- 장점
→ 별도의 인프라 필요 없음
→ HTTP 프로토콜 최대한 활용
→ HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용 가능
→ Hypermedia API의 기본을 지키며 범용성 보장
→ REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악
→ 서비스 디자인에서 생길 수 있는 문제를 최소화
→ 서버와 클라이언트의 역할 분리
- 단점
→ 표준의 부재
→ 사용할 수 있는 메소드가 4가지
→ 구형 브라우저가 아직 제대로 지원해주지 못함(PUT, DELETE, pushstate) - REST의 필요성
- 애플리케이션 분리 및 통합
- 다양한 클라이언트 등장
- 서버 프로그램은 다양한 브라우저, 모바일 디바이스에서도 통신할 수 있어야 함 - REST 구성 요소
- 자원(Resource) : URI
→ 모든 자원에 고유한 ID가 존재, 이 자원은 Server에 존재
→ 자원을 구별하는 ID는 '/groups/:group_id'와 같은 HTTP URI
→ Client는 URI를 이용해 자원을 지정하고 해당 자원의 상태에 대한 조작을 Server에 요청
- 행위(Verb) : HTTP Method
→ GET, POST, PUT, DELETE와 같은 HTTP 프로토콜 Method를 사용
- 표현(Representation of Resource)
→ Client가 자원의 상태에 대한 조작을 용청하면 Server는 이에 적절한 응답
→ REST에서 하나의 자원은 JSON, XML, TEXT, RSS 등 여러 형태의 Representation으로 나타냄(JSON, XML이 일반적) - 특징
- Server-Client
→ 자원이 있는 Server, 자원을 요청하는 Client
(REST Server : API를 제공하고 비즈니스 로직 처리 및 저장)
(Client : 사용자 인증이나 context(세션, 로그인 정보)등을 직접 관리하고 책임)
→ 의존성이 줄어듬
- Stateless(무상태)
→ Client의 context를 Server에 저장하지 않음(세션, 쿠키와 같은 context 정보를 신경쓰지 않아도 되므로 구현 단순)
→ Server는 각각의 요청을 완전히 별개의 것으로 인식하고 처리(Server의 처리 방식에 일관성을 부여하고 부담이 줄어듦, 서비스의 자유도 높아짐)
- Cacheable(캐시 처리 가능)
→ 웹 표준 HTTP 프로토콜을 그대로 사용해서 Last-Modified 태그나 E-Tag를 이용하여 가장 강력한 특징 중 하나인 캐싱 기능 구현 가능
(캐시 사용을 통해 응답시간이 빨라지고 REST Server 트랜잭션이 발생하지 않기 때문에 전체 응답시간, 성능, 서버의 자원 이용률을 향상 가능)
- Layered System(계층화)
→ Client는 REST API Server만 호출
→ REST Server는 다중 계층으로 구성 가능
(API Server는 순수 비즈니스 로직을 수행하고 그 앞단에 보안, 로드밸런싱, 암호화, 사용자 인증 등을 추가하여 구조상의 유연성 부여 가능, 로드 밸런싱, 공유 캐시등을 통해 확장성과 보안성 향상 가능)
→ PROXY, 게이트웨이 같은 네트워크 기반의 중간 매체를 사용 가능
- Code-On-Demand(optional)
→ Server로부터 스크립트를 받아 Client에서 실행
→ 반드시 충족할 필요 없음
- Uniform Interface(인터페이스 일관성)
→ URI로 지정한 Resource에 대한 조작을 통일되고 한정적인 인터페이스로 수행
→ HTTP 표준 프로토콜에 따르는 모든 플랫폰에서 사용가능(특정 언어, 기술에 종속되지 않음)
REST API
- 의의
- API(Application Programming Interface)
→ 데이터와 기능의 집합을 제공하여 컴퓨터 프로그램간 상호 작용 촉진, 서로 정보 교환 가능하도록 함
- REST API의 정의
→ REST 기반을 서비스 API를 구현한 것
→ 최근 OpenAPI, 마이크로 서비스등을 제공하는 업체 대부분은 REST API를 제공 - 특징
- 사내 시스템들도 REST 기반으로 시스템을 분산해 확장성과 재사용성을 높여 유지보수 맟 운용을 편리하게 가능
- REST는 HTTP 표준을 기반으로 구현하므로, HTTP를 지원하는 프로그램 언어로 클라이언트, 서버를 구현 가능(델파이 클라이언트 뿐 아니라, JAVA, C#, Web 등을 이용해 클라이언트 제작 가능) - 설계 기본 규칙
(참고 리소스 원형)
→ 도큐먼트 : 객체 인스턴스나 데이터베이스 레코드와 유사한 개념
→ 컬렉션 : 서버에서 관리하는 디렉터리라는 리소스
→ 스토어 : 클라이언트에서 관리하는 리소스 저장소
- URI는 정보의 자원을 표현해야 함
i. resource는 동사보다는 명사, 대문자보다는 소문자 사용
ii. resource의 도큐먼트 이름으로는 단수 명사 사용
iii. resource의 컬렉션 이름으로는 복수 명사 사용
iv. resource의 스토어 이름으로는 복수 명사 사용
- 자원에 대한 행위는 HTTP Method(Get, PUT, POST, DELETE 등)로 표현
i. URI에 HTTP Method가 들어가면 안됨
ii. URI에 행위에 대한 동사 표현이 들어가면 안됨
iii. 경로 부분 중 변하는 부분은 유일한 값으로 대체 - 설계 규칙
- '/'구분자는 계층 관계를 나타낼 때 사용
- URI 마지막 문자로 '/'를 포함하지 않음
- '-'은 URI 가독성을 높이는데 사용
- '_'는 URI에 사용하지 않음
- URI경로에는 소문자가 적합(RFC 3986은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정)
- 파일확장자는 URI에 포함하지 않 -
설계 예시
CRUDHTTP verbsRouteresource들의 목록을 표시 GET /resource resource 하나의 내용을 표시 GET /resource/:id resource 생성 POST /resource resource 수정 PUT /resource/:id resource 삭 DELETE /resource/:id
(참고 응답상태코드)
→ 1XX : 전송 프로토콜 수준의 정보 교환→ 2XX : 클라이언트의 요청이 성공적으로 수행됨
→ 3XX : 클라이언트는 요청을 완료하기 위해 추가적인 행동을 취해야 함
→ 4XX : 클라이언트의 잘못된 요청
→ 5XX : 서버쪽 오류오 인한 상태코드
RESTful
- 의의- RESTful은 일반적으로 REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어
- RESTful은 REST를 REST 답게 쓰기 위한 방법(공식 발표 아님) - 목적
- 이해하고 쉽고 사용하기 쉬우 REST API 만들기
- RESTful한 API를 구현하는 근본적인 목적이 성능 향상이 아닌 일관적인 컨벤션을 통한 API의 이해도 및 호환성을 높이는 것이 주 동기, 성능이 주용한 상황에서는 RESTful한 API 구현할 필요 없음 - RESTful하지 못한 경우
- CRUD 기능을 모두 POST로만 처리하는 API
- route에 resource, id 외의 정보가 들어가는 경우
Reference
keywordcontents
URI |
Uniform Resource Identifier 통합 자원 식별자 : 정보 리소스를 고유하게 식별하고 위치 지정 가능 |
URL |
Uniform Resource Locator 통합 자원 지시자(URI의 가장 흔한 형태) : 구체적인 위치 서술 |
URN |
Uniform Resource Name 해당 리소스의 위치에 영향 받지 않는 유일무이한 이름 역할 |
DataBase Record | row, 관계형 데이터베이스에서 record or tuple로 불림 |
HATEOAS |
Hypermedia As The Engine Of Application State 하이퍼미디어를 애플리케이션의 상태를 관리하기 위한 매커니즘으로 사용 |
HTTP 프로토콜 |
HTTP(Hypertext Transfer Protocol) : 인터넷 상에서 데이터를 주고 받기 위한 Server/Client 모델을 따르는 프로토콜, 애플리케이션 레벨의 프로토콜로 TCP/IP위에서 작동 - Hypertext(단순한 1차원의 문장 구조에 머물지 않고 관련된 텍스트 정보를 짜맞추어 표시하도록 한 컴퓨터 텍스) 기반으로 데이터를 전송하겠다 Connectless 방식 : 서버에 연결하고 요청해서 응답을 받으면 열결을 끊음(기본적으로 자원 하나에 대해 하나의 연결을 만듬) - 장점 : 불특정 다수를 대상으로 하는 서비스에 적합한 방식 - 단점 : 연결을 끊어버리기에 Client의 이전 상태를 알 수 없음(stateless) |
PROXY | Server와 Client 사이에 중계기로서 대리로 통신을 수행하는 것 |
PROXY Server | Client가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 가리킴 (중계 기능) |
gateway | 컴퓨터 네트워크에서 서로 다른 통신망, 프로토콜을 사용하는 네트워크 간의 통신을 가능하게 하는 컴퓨터나 소프트웨어를 두루 일컫는 용어(다른 네트워크로 들어가는 입구 역할을 하는 네트워크 포인트) |