API(Application Programming Interface)는 어플리케이션 소프트웨어를 구축하고 통합하는 정의 및 프로토콜 세트입니다.
예를 들어, 기상청 서버가 있습니다. 이 기상청의 날씨 서비스용 API를 사용하는 다양한 웹사이트나 앱들이 이 기상청 서버로 부터 실시간으로 날씨 정보를 요청하여 데이터를 받아갈 수 있습니다.
웹사이트나 웹은 지정된 형식을 통하여 날짜, 지역등을 넣어서 요청하면, 기상청 서버는 최고 기온, 최저 기온으로 구성된 응답으로 답하도록 지정할 수 있는 것입니다.
HTTP Object Model
입니다.HTTP Object Model
을 REST
라는 이름으로 변경하여 발표하게 됩니다.REST API
가 등장하며 기존의 사용하기 어려운 복잡한 SOAP API
를 대체하며 시장에서 승리하게 됩니다.REST(Representational State Transfer: 자원의 상태 전달)란, API 작동 방식에 대한 조건을 부과하는 소프트웨어 아키텍처입니다.
아키텍처라는 것은 제약조건의 집합입니다. 즉 아래의 REST의 6가지 제약조건을 따라야 REST라고 할 수 있습니다.
REST는 HTTP URI를 통하여 자원을 명시하며, HTTP 메소드(GET, POST, PUT, DELETE)를 통하여 해당 자원에 대한 CRUD Operation을 적용합니다.
REST API를 구현하는 시스템은 REST가 클라이언트-서버 상호 작용을 최적화하기 때문에 효율적으로 크기를 조정할 수 있습니다.
RESTful 웹 서비스는 완전한 클라이언트-서버 분리를 지원합니다. 그러므로 서버 애플리케이션의 플랫폼 또는 기술 변경이 클라이언트 애플리케이션에 영향을 주지 않습니다.
REST API는 사용되는 기술과 독립적이기 때문에, API 설계에 영향을 주지 않고 다양한 프로그래밍 언어로 클라이언트 및 서버 애플리케이션을 모두 작성할 수 있습니다.
사용자가 필요한 것 보다 더 많은 데이터를 가져오는 경우.
Over Fetching과 반대 개념으로, 사용자가 필요한 정보보다 더 적은 데이터를 가져오는 경우.
클라이언트와 서버가 서로 독립적으로 분리되어있어야 합니다.
요청에 대하여 클라이언트의 상태를 서버에 저장하지 않습니다.
즉 클라이언트가 요청할 때,
햄버거 주세요 >> 콜라도 같이 주세요
가 아니라,
햄버거 주세요 >> 햄버거, 콜라주세요
이처럼 매번 새롭게 요청해야 합니다.
서버와 클라이언트 사이에 방화벽, 게이트웨이, 프록시 등 다양한 계층 형태로 구성이 가능해야 하며, 이를 확장할 수 있어야 합니다.
인터페이스의 일관성을 지키고, 아키텍처를 단순화시켜 작은 단위로 분리하여 클라이언트와 서버가 독립적으로 개선될 수 있어야 합니다.
인터페이스의 일관성은 아래의 4가지의 제약조건이 있습니다.
웹 기반의 REST에서는 리소스에 접근할 때 URI를 사용합니다.
ex) https://foo.co.kr/user/100
이 때 리소스는user
가 되며 식별자는100
이 됩니다.
웹에서 가장 많이 사용하는 데이터 전달 방식은 HTML, XML, JSON, TEXT, 등이 있습니다.
이 중에서 어떠한 타입의 데이터인지 알려주기 위해서 HTTP 헤더 부분에 content-type를 통하여 데이터의 타입을 지정합니다. 또한 리소스 조작을 위하여 데이터 전체를 전달하지 않고 메세지로 전달합니다.
- ex) 서버에서 user
정보의 전화번호를 number
라고 결정하고 이 정보를 클라이언트와 주고받을 때 그대로 사용하였습니다. 그런데 그 후에 서버 리소스 변경으로 phone-number
로 바꾼다면 클라이언트는 처리하지 못하고 에러가 날 것 입니다.
이런 부분을 방지하기 위하여 별도의 메세지 형태로 데이터를 주고받고 client-sever가 독립적으로 확장 가능하게 해야 합니다.
예를 들어, 아래와 같습니다.
// 자기 서술적 메세지가 아님
HTTP/1.1 200 OK
[{
"op": "remove",
"path": "a/b/c"
}]
// 자기 서술적 메세지
HTTP/1.1 200 OK
Content-Type: application/json-patch+json
[{
"op": "remove",
"path": "a/b/c"
}]
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<head></head>
<body>
<a href="/test">test</a>
</body>
</html>
HTTP/1.1 200 OK
Content-Type: application/json
Link: </articles/1>; rel="previous",
</articles/3>; rel="next";
{
"title": "The second article",
"contents": "some thing blah..."
}
자바 애플릿, 자바스크립트, 플래시 등 특정한 기능을 서버로 부터 클라이언트가 전달받아 코드를 실행할 수 있어야 합니다.
이러한 위의 조건을 잘 갖추면 RESTful하다고 표현하며, 이를 REST API라고 부릅니다.
URI를 설계하는데는 다음과 같은 원칙이 있습니다.