4. 하이퍼미디어

RESTful API

4장 하이퍼미디어

  • 클라이언트는 어떤 요청을 해야 할지 어떻게 아는 것일까? ⇒ 하이퍼미디어
  • 하이퍼미디어는 서버가 클라이언트에게 나중에 어떤 HTTP 요청을 보낼 수 있을지 설명하는 방식이다.

하이퍼미디어 유형으로서의 HTML

  • <a> 태그는 HTTP GET 요청을 만들 수 있음을 브라우저에 알려주는 신호다.
    • 더 정확히는, 특정 URL이 방문할 수 있는 리소스를 부른다는 웹 서버의 약속
    • 사용자가 활성화할 때만 요청(클릭)이 진행된다.
  • <img> 태그도 요청할 수 있는 HTTP GET 요청을 설명하긴 하지만, 문서 사이를 이동한다는 뜻은 담겨 있지 않다.
    • 이 요청은 백그라운드에서 자동으로 일어난다(클릭하지 않아도 알아서 보내고 받아온다).
  • <form> 태그는 method에 따라 결정된다.
    • method=”POST” 면 클라이언트가 구성한 커스텀 엔티티 바디가 포함된 POST 요청을 보낸다.
    • method=”GET”인 경우 클라이언트가 구성한 특정 커스텀 URL에 보내는 GET 요청을 나타낸다.
    • GET 요청은 사용자가 컨트롤을 활성화할 때만 보내진다.
  • 하이퍼미디어 정의

    하이퍼미디어는 애플리케이션 컨트롤 정보가 정보 표현 내부에 포함되거나 그 위 계층에 존재하는 것으로 정의한다.

URI 템플릿

  • 또 다른 종류의 하이퍼미디어 기술인 URI 템플릿은 URL을 구성할 방법을 브라우저에 알려줄 수 있다.
    • 밑에서 나오지만, URI 만으로 정확한 리소스의 위치를 알 수 없으니까?
  • URI 템플릿은 목적지 URI를 제외하고는 HTTP 요청에 대해 아무것도 정의하지 않는다.
  • 그래서 URI 템플릿은 그 자체로는 의미가 없고 다른 하이퍼미디어 기술과 합쳐져야 한다.

URI 대 URL

  • URL과 URI 모두 리소스를 식별하는 짧은 문자열이다.
  • URI
    • Uniform Resource Identifier
    • 는 식별자일 뿐, 리소스의 표현이 있다는 보장이 없다.
    • ex1) “urn:isbn:978-3-16-148410-0” (a URN that identifies a book by its ISBN)
    • ex2) “mailto:info@example.com” (a URI that specifies an email address)
    • ex3) “tel:+1-212-555-1212” (a URI that specifies a phone number)
  • URL은 주소의 디레퍼런싱이 가능한 식별자이다.
    • Uniform Resource Locator
    • 따라서 컴퓨터는 URL을 가지고 하부 리소스의 표현을 어떻게든 얻어올 수 있다.
  • LInk 라는 HTTP 요청과 응답의 헤더는 JSON 객체나 바이너리 이미지 파일 같이 보통 하이퍼미디어를 지원하지 않는 엔티티 바디에 간단한 하이퍼미디어 컨트롤을 추가할 수 있게 해준다.

하이퍼미디어는 무엇을 위한 것인가

  • 세가지 역할을 수행한다.
    1. HTTP 요청을 구성하는 방법을 클라이언트에 알려준다.
    2. HTTP 응답에 대한 약속을 한다.
    3. 클라이언트가 자신의 작업 흐름에 응답을 어떻게 통합해야 할지 제시한다.

요청 안내하기

  • HTTP 요청은 메서드, 목적지 URL, HTTP 헤더, 엔티티 바디의 네 부분으로 이루어진다.
  • 하이퍼미디어 컨트롤은 이 네 가지를 모두 지정하도록 안내한다.
  • 관습적으로, 클라이언트가 보내는 형태를 모두 허용한다.
    • 경우에 따라 특정 값이 포함되어야 하는 등의 설명도 추가할 수 있다.

응답에 대한 약속

  • <img> 태그는 클라이언트가 특정 URL에 GET 요청을 보낼 수 있다는 약속이다.
  • 이와 동시에, 서버가 GET의 응답으로 이미지 표현의 한 종류를 보낼 것이라는 약속이기도 하다.
  • ex1) <link re="edit" href="http://example.org/posts/1">
    • rel="edit" 은 리소스가 GET뿐 아니라 PUT과 DELETE도 지원함을 알려준다.
    • rel="edit"은 AtomPub이 멤버 엔트리(Member Entry)라 부르는 종류의 문서를 응답으로 받게 된다.
      • 따라서 클라이언트는 GET 요청 후 Contet-Type을 확인하지 않아도 된다.

작업 흐름 조절

  • 리소스 간의 관계를 설명한다.
  • <a> 는 outbound link라 클라이언트의 애플리케이션 상태를 완전히 새로운 상태로 대체한다.
  • <img>, <framset>, <iframe> 은 임베딩된 링크다.

가짜 하이퍼미디어를 조심하자!

  • 어떤 API가 다음 값을 줬다고 생각해보자
1
2
3
4
5
6
7
HTTP/1.1 200 OK
Content-Type: application/json

{
 "title": "Example: A Novel",
 "description": "http://www.example.com/"
}
  • 이건 그저 문자열일 뿐이다.
  • 하지만 링크인지, 설명을 제공하는 리소스의 URL인지 알 수 없다.
  • 따라서, 일반 JSON을 제공하는 API를 설계해선 안된다.
  • 하이퍼미디어를 제대로 지원하는 미디어 유형을 사용해야 한다.

의미 체계의 문제: 잘 대응하고 있는가?

  • 1장에서 얘기한 “어떻게 컴퓨터가 어떤 링크를 클릭할지 결정할 수 있게 만들 것인가?”
  • 일단 링크를 제공하면서 첫 단계는 통과함
  • 하지만 여러 개가 주어진다면 무엇을 클릭할 지는 아직 알려 주지 않았다.