API는 Application Programming Interface의 약자로 소프트웨어가 다른 소프트웨어로 정해진 형식으로 원격의 메소드를 호출하는 인터페이스를 의미한다. 꼭 네트워크 상에서만 API가 존재하는것은 아니다.
로컬 프로그램인 브라우저, 윈도우에서는 시스템이나 하드웨어로부터 정해진 지시대로 소프트웨어를 짤 수 있는 Windows API를 제공한다. '이 함수를 넣으면 윈도우가 이렇게 해준다'라는 간략한 지식만 알 수 있으면 시스템, 하드웨어의 깊은 지식 없이 개발자는 소프트웨어의 프로그래밍만 집중할 수 있게 된다는 의미이다.
REST라는 형식의 아키텍쳐를 따르는 API이다. 과거의 SOAP이란 요청방식을 대체하고 오늘날의 REST가 된 것 REST API의 특징으로는 각 요청이 어떤 동작 정보를 위한 것인지 그 요청의 모습 자체로도 이해를 할 수 있어야 한다.
틀린말은 아니지만 서비스 규모가 커지고 공동으로 개발하는 사람들이 많아질수록 이런 REST를 따르지 않는다면 해당 서비스를 인수인계 받는다던가 혹은 서비스에서 제공하는 API를 사용해서 다른 제품을 만들 개발자들이 사용하는 경우 유지보수 측면에 있어서 복잡성이 증가하게 될것이다. 반대로 RESTful 하게 만든 API는 요청을 보내는 주소만으로도 그 요청의 의도를 온전히 파악할 수 있다. 아래의 예시 처럼 말이다.
서버와 클라이언트 사이 요청과 응답은 HTTP로 이루어지는데 이 HTTP 요청을 보낼때는 여러가지 메소드가 존제한다.
mdn web docs _ https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/PATCH
REST API에서는 주로 GET,POST,DELETE,PUT,PATCH를 사용한다.
POST,PUT,PATCH에는 BODY라는 주머니가 있어서 GET이나 DELETE보다 많은 정보들을 그리고 안전하게 감추어 담아서 서버로 보낼 수 있다.

하지만 각 요청메소드가 특정 기능에 제한되어져 있지 않다. 예를들어 POST 메소드만 해도 읽고,쓰고,삭제하고,수정하기가 모두 가능하다. 그렇지만 RESTful 한 API를 만들기 위해서는 각 메소드가 만들어진 의도에 따라 적절하게 사용해야한다.
예를들어
위의 예시처럼 각 메소드의 정의된 역할에 맞게 사용함을 준수하는 것 처럼 말이다.
그리고 동시에 URI와 메소드를 함께 유추하여 요청의 의도를 온전히 해석할 수 있어야 RESTful 한 API라 할 수 있다. 아래의 예시를 보자
그리고 또다른 REST의 규칙 중 하나로 URI의 PATH를 명사로만 구성해야 한다는것, 해당 URI의 목적은 HTTP 메소드로 유추하도록 구성하는 것이다.
RESTful 한 API는 URI가 명사로만 구성되어야 하고 HTTP 메소드와 URI만으로 요청의 의도를 온전히 해석할 수 있어야 한다는것
참고내용
얄팍한 코딩의 REST API가 뭔가요?
https://www.youtube.com/watch?v=iOueE9AXDQQ
1991년 WEB의 창시자 팀 버너스 리가 어떻게 인터넷에서 정보를 공유할 것인가 라는 문제에 다음과 같이 답을 내렸다.
"모든 정보들을 하이퍼텍스트로 제공하면 될 것이고 아래와 같은 형식으로 제공한다."
HTTP/1.0 (1994-1996)
Roy T.Fielding "어떻게 웹을 망가뜨리지 않으면서 HTTP를 진보시킬수 있을까?"
해결책 : HTTP Object Model
4년 뒤(1998) REST라는 이름으로 소개가 되고
2년 뒤(2000) Roy T.Fielding, 약 120페이지의 박사 논문으로 발표가 되었다.
1998년 마이크로소프트에서 XML_RPX라는 원격으로 다른 시스템의 메소드를 호출 할 수 있는 프로토콜을 만들었다. -> SOAP
2000.02 Salesforce 에서 SOAP이란 이름으로 API를 공개하였다. 인터넷 세계에서 최초로 공개된 API였다.
메소드 하나를 가져오는 요청 분량, 굉장히 복잡했다. 그래서 인기가 없었다고..
4년 뒤(2004.08) flickr가 새로운 REST라는 이름으로 새로운 API를 발표했다.
REST와 SOAP의 비교 샷 REST가 훨씬 더 간결해보인다.
이런 비교로 결국 SOAP API는 아래의 그래프 처럼 REST API에 추월당하였다.
그리고 결국..
- 2006년 AWS가 자사 API의 사용량의 85%가 REST임을 밝힘그렇게 WWW세상에 REST 가 정착이 되나 싶었지만 2008년 CMIS가 발표가 되었다.
그리고 Roy T.Fielding은 이에 대해 다음과 같이 말했다.
"No REST in CMIS"
2016년에 Microsoft는 REST API에 대한 가이드 라인을 다음처럼 발표했다.
그리고 Roy T.Fielding은 이에 대해 다음과 같이 말했다.
사람들이 생각했던 REST API하고 Roy T.Fielding가 발표했던 REST API는 너무나도 달랐다.
도대체 뭐가 문제였던 것일까?
REST 아키텍쳐 스타일을 따르는 API를 REST API라고 한다.
분산 하이퍼미디어 시스템(웹) 을 위한 아키텍쳐 스타일이다.
메세지가 스스로 설명해야 한다. 메세지를 보고 온전한 해석이 가능해야 한다는 의미이다.
이 HTTP 요청 메세지는 뭔가 빠져있어서 self-descriptive 하지 못하다. 아래 처럼 목적지를 추가해야 이제 self-descriptive한 요청이 된다.
그리고 또 생각해볼 것이 있다. 아래의 예시는 self-descriptive하지 못한 응답 메세지 이다.
이 상태로는 어떤 문법으로 작성되었는지 모르기 때문에 해석을 못한다. 그래서 아래와 같으 Content-Type 헤더가 추가가 되어야 한다.
이렇게 함으로써 []의 의미와, {}의 의미, 콜론으로 감싸진 문자열들의 의미가 무엇인지 알기 때문에 파싱이 가능해지고 문법을 해석할 수 있게되었다. 그렇다면 이제 self-descriptive하게 되었느냐? 아니다. 부족하다. 왜냐하면 이 응답을 해석하였다 해도 key값의 의미를 정확히 해석을 못하기 때문이다. 아래의 예시를 보자
위 처럼 Content Type 헤더에 application/json.patch +json라고 명시가 되어있는데
json.patch +json 라는 미디어타입으로 정의되어있는 메세지라는 의미이다. 이에 대한 명세를 찾아가서 이 메세지를 해석을 하면 그제야 이 메세지에 대한 옳바른 해석을 가능하게 된다.
이 처럼 이 하나의 응답으로 모든것을 해석이 가능해야 한다는 것.
HATEOS의 의미는 애플리케이션 상태는 Hyperlink를 이용해 전이되어야 한다는 의미
간혹가다 모바일 환경에서 UI가 깨지는 경우도 있지만 페이지의 기능은 잘 된다. REST가 어느정도 만족되었기 때문이다.
그러나 모든 기종에 대한 호환성을 끝까지 지켜지지 못하는 경우가 있어 강제적 업데이트를 하는 경우가 생기는데 웹브라우저는 그런일이 생기지 않는다. 모바일의 경우는 엄밀히 말하면 REST 하지 않아서 그런거지만 말이다.
HTTP/1.1의 공식 문서 발표가 있기 까지 7년이란 시간이 걸렸다. 모든 웹앱 어플리케이션이 HTTP/1.0 가이드를 따르고 있었기 떄문에 조금이라도 변경된 사항이 있으면 호환성에 큰 문제가 생기기 때문이다.
네, 그렇습니다.
네 그렇습니다.
Roy T.Fielding는 다음과 같이 말했습니다.
"An API that provides network-based access to resources via a uniform interface of self-descriptive messages containing hypertext to indicate potential state transitions might be part of an overall system that is a RESTful application"
"하이퍼 텍스트를 포함한 self-descriptive한 메세지의 uniform interface를 통해 리소스에 접근하는 API는 RESTful application의 전부이다."
그리고 Roy T.Fielding 는 "원격 API가 꼭 REST API이어야 하는가" 에 대한 질문에 다음과 같이 답변했다.
"시스템 전체를 통제할 수 있다고 생각하거나, 진화에 관심이 없다면, REST에 대해 따지느라 시간을 낭비하지 마라"
흔한 웹페이와 HTTP API의 비교표이다. HTTP API는 모바일 같은 디바이스가 이해할 수있는 포맷, 즉 미디어타입을 사용한다.
HTML에서는 a태그가 가능하고 각각의 a태그가 있다고 가정했을 시 각자의 목적에 대한 명세가 잘 표현되어 있지만 JSON 같은 경우에는 그렇지 않다. JSON은 문법 해석은 가능하지만, 의미를 해석하려면 별도의 문서(API 문서 등) 필요하다.
### Self-descriptive
방법1: Media type
1. 미디어 타입을 하나 정의한다.
2. 미디어 타입 문서를 작성한다. 이 문서에 "id"가 뭐고 "title"이 뭔지 의미를 정의한다.
3. IANA에 미디어 타입을 등록한다. 이 때 만든 문서를 미디어 타입의 명세로 등록한다.
4. 이제 이 메세지를 보는 사람은 명세를 찾아갈 수 있으므로 이 메세지의 의미를 온전히 해석할 수 있다.
단점은 매번 media type을 정의해야 한다.

방법2: Profile
1. "id"가 뭐고 "title"이 뭔지 의미를 정의한 명세를 작성한다.
2. Link 헤더에 profile relation으로 해당 명세를 링크한다.
3. 이제 메시지를 보는 사람은 명세를 찾아갈 수 있으르모 이 문서의 의미를 온전히 해석할 수 있다.
단점
1. 클라이언트가 Link 헤더(RFC 5988)와 profile(RFC 6906)을 이해해야 한다.
2. Content negotiation을 할 수 있다. 왜냐하면 미디어타입으로 판단 하는게 아니라 링크 헤더에 명시된 내용으로만 판단하기 때문이다.
방법 1 :: data로
data에 다양한 방법으로 하이퍼링크를 표현한다.
단점은 링크를 표현하는 방법을 직접 정의해야 한다.
JSON으로 하이퍼링크를 표현하는 방법을 정의한 명세들을 활용한다.
단점 : 기존의 API를 많이 수정해야 한다(침투적)
방법2:HTTP 헤더로
Link, Location 등의 헤더로 링크를 표현한다.
단점 : 정의된 relation만 활용한다면 표현에 한계가 있다.
data, 헤더 모두 활용하면 좋다.
하이퍼 링크라는 표현만 되면 다 괜찮다.
NO, 아니다.
Roy. T.Fielding이 말하길..
"A REST API should be entered with no prior knowledge beyond the intitial URI (bookmark) and set of standardized media types that are appropriate for the intended audience (i.e., expected to be understood by ant client that might use the API)."
"만약 의도한 저자가 이해할수 있다면, 예를들어 회사 내부에서만 사용하는 API라면 그 사람들이 이 Media type을 이해 한다면 꼭 그럴필요는 없지만 권장한다. 하면 좋다"
https://www.youtube.com/watch?v=RP_f5dMoHFc, 그런 REST API로 괜찮은가.