8장 프로파일
현재까지 공부한 API 설계의 규칙
프로토콜 의미 체계의 문제 해결법
- 내 문제에 맞는 도메인 특화표준이 있다? ⇒ 사용
- 애플리케이션 특화 확장은 문서화
- 내 문제에 맞는 컬렉션 패턴이 있다? ⇒ 사용
- 애플리케이션 특화 용어를 정의하고 문서화
- 둘 다 해당되지 않으면? ⇒ 일반적인 하이퍼미디어 유형 사용
- 애플리케이션을 상태 전이로 나누고 문서화
애플리케이션 의미 체계의 문제 해결법
- 내 문제에 맞는 마이크로데이터 아이템이나 마이크로포맷이 있다? ⇒ 사용
- 문서화
- 없으면 애플리케이션 특화 용어를 정의
- 문서화
결국 문서화는 필요하다.
클라이언트는 문서를 어떻게 찾는가?
- 요청과 응답은 추측이 없이, 자기 서술형 메시지여야 한다.
- 의미 체계는 두 종류가 있다.
- 프로토콜 의미 체계
- 애플리케이션 의미 체계
- hCard를 사용하는 HTML 문서 ⇒ 파싱으로 프로토콜은 알 수 있으나 애플리케이션은 알 수 없다.
- 트위터 API에서 제공하는 JSON 문서 ⇒ 둘 다 알수 없다.
- 여기서 알 수 없는(빠진) 규격을 **프로파일(profile)**이라고 부른다.
프로파일이 뭘까?
RFC 6906에 나온 정의
프로파일은 리소스 표현 자체의 의미 체계를 변경하기 위함이 아니라 클라이언트에게 미디어 유형에 의해 정의된 의미 체계에 더해 그 리소스 표현에 연계된 추가적인 의미 체계를 알 수 있게 하기 위해 정의된다.
프로파일에 연결하기
hCard를 사용하는 HTML 문서와 트위터 API에서 제공되는 JSON 문서에서 빠진것은 프로파일과 그것을 사용하는 문서사이의 연결이다.
클라이언트 : 그래서 어떤 프로파일이 적용되는데? ⇒ 하이퍼미디어로 연결해줄 수 있다.
profile 연결 관계
rel="profile"을 가진 태그.
profile 미디어 유형 매개 변수
헤더에 있는 Content-Type 에 추가할 수 있다.
Content-Type: application/json'profile="https://dev.twitter.com/docs
특수 목적 하이퍼미디어 컨트롤
<div itemscope itemtype="http://schema.org/Person">
프로파일은 프로토콜 의미 체계를 설명한다
- 프로파일은 JSON처럼 하이퍼미디어 컨트롤이 없는 미디어 유형과 같은 경우에만 프로토콜 의미 체계를 설명할 필요가 있다.
- HTML 처럼 온전히 기능을 갖춘 하이퍼 미디어 유형을 표현 형식으로 사용하면, 적어도 API 문서에서 프로토콜 의미 체계에 대해 말할 필요는 없어진다.
프로파일은 애플리케이션 의미 체계를 설명한다
API 문서는 보통 “fn”, “bday”, “east”, “flip” 같은 문자열들을 설명한다.
이 문자열들은 JSON 객체의 키이거나, XML 태그 이름등에 사용하는 변수들이다.
컴퓨터에게 애플리케이션 의미체계를 이해시킬 때, “fn”이 CSS 클래스로 사용될 때 나오는 것이라고 말하는 것이 훨씬 쉽다.
이 문자열들은 프로파일을 단순화 할 수 있게 해준다.
연결관계
- 하이퍼미디어 컨트롤에 붙는 문자열로, 클라이언트가 해당 컨트롤을 활성화하면 어떤 상태 전이가 일어날지를 설명한다.
- 연결 관계를 지원하는 하이퍼미디어 컨트롤은 목적 URL을 위한 공간 하나(
href), 연결 관계를 위해 두 번째 공간(rel)을 정의한다.
안전하지 않은 연결 관계
- 연결 관계가 GET 요청을 의미하는 것은 아니다.
의미 체계 서술자
- 사람의 전체 이름을 표시하는 CSS 클래스
- hCard 마이크로포맷 : “fn”
<span class="fn">junsu bae</span> - http://schema.org/Person : “name”
<span iotemprop="name">junsu bae</span> - 트위터 API 문서 : 특정
{ "name" : "junsu bae"}
- hCard 마이크로포맷 : “fn”
- 모두 사람의 이름을 나타내는 동일한 목표를 다른 방식으로 접근한다.
- 이것들이 의미 체계 서술자(semantic descriptor)이다.
- 트위터 API 같은 문서에선 관습적인 이름 짓기일 뿐이다.
XMDP: 기계가 이해할 수 있는 첫 번째 프로파일 형식
- 다른 마이크로포맷을 설명하는 마이크로포맷
- 컴퓨터는 어떤 CSS 클래스가 hCard 속하는 지 알 수 있다.
ALPS
- HTML은 웹에서는 독보적으로 사용되는 표현 형식이지만, 웹 API에선 아니다(JSON).
| |
- 사람은 Docs로 자세히 볼 수 있음
- 기계는 “vcard” 로 태그된 요소 안에서 “fn” 요소를 보게 될 것이라는 걸 알게 된다.
type="safe"인 descriptor는 멱등한 GET 요청임을 알 수도 있다.
ALPS의 장점
- HTML 뿐 아니라 HAL, XML, JSON, 사이렌 등의 표현에도 사용될 수 있다.
ALPS가 모든 것을 하진 않는다.
- 의미 체계 서술자가 필요하다거나
- 특정 위치에 한 번만 나올수 있다는 표현은 할 수 없다.
JSON-LD
- 콘텍스트(context)라 부르는 기계가 이해할 수 있는 문서를 일반적인 JSON 문서에 결합시킨다.
임베딩된 문서
- 사이렌 버전으로 작성된 스위치 조작에 관한 폼을 보자
| |
- flip과 “Flip the mysterious switch” 는 중복이다.
- 전자는 클라이언트 프로그래머를 위한 표현이고, 후자는 사람을 위한 표현이다.
- 이 둘을 연결하는 것은 없고, 영어 문장은 프로파일조차 아니다.
- 현실적으로, 사용자가 API로 뭘 할지 모르니 포함시켜야 한다.
요약
- 의미체계의 문제를 어떻게 처리할 것인가? ⇒ 잘 선택한 미디어 유형 + 프로파일
- 연결 관계 : 클라이언트가 하이퍼미디어 컨트롤을 동작시키면 발생할 상태 전이를 설명하는 문자열
- 의미 체계 서술자 : 표현의 어떤 부분이 무슨 뜻인지를 알려주는 짧은 문자열
- 연결 관계와 의미 체계 서술자는 그 자체로는 의미가 없다.
- 하지만 반드시 근처에 있는 문서가 사람이 이해할 수 있는 설명을 담고 있다 ⇒ 프로파일
- 기계가 이해할 수 있는 프로파일 : 클라이언트가 자동으로 연결 관계나 의미 체게 서술자의 사람이 이해할 수 있는 정의를 찾아볼 수 있게 해준다.
- JSON-LD는 기존 클라이언트들을 망가뜨리지 않고 JSON API에 간단한 하이퍼미디어 컨트롤을 추가할 수 있다.
- 프로파일은 하이퍼미디어 표현에 포함된 사람이 이해할 수 있는 텍스트를 대체할 수 없다. 둘은 용도가 다르다.
- 프로파일 : 개발자들이 스마트한 클라이언트를 작성하도록 해준다.
- 표현에 포함된 텍스트 : 클라이언트를 통해 애플리케이션을 사용할 수 있게 해준다.