데이터 직렬화(Serialization)를 기본 개념으로해 RPC호출을 이기종간에 가능하게 하는 개념.
JSON기반의 문장열을 이용해 데이터 타입에 대한 정보를 클라이언트와 서버 사이에 주고 받으면서 데이터 타입을 확인하는 과정을 거치는 형태를 사용한다.
이런방식을 이용하면 컴파일 시점이 아닌 실행 시점에서 IDL정보를 이용해 호추하는 방식도 지원할 수 있다.
1. 스키마
- 전송이나 저장시의 데이터 포맷에 대한 정의.
RPC 호출 : 전송할 데이터의 스키마 정보를 먼저 전송한 후 실제 데이터 전송.
파일저장 : 파일 앞부분에 스키마 정보 저장, JSON형태로 표현된다.
예) {"type":"타입명" ...속성...} 형식으로 정의. 사용 예{"type":"string"}
type은 예약어로 스키마 정의를 나타낸다.
type명의 두가지 종류.
1. 원시타입(Primitive type)
- 종류
- null : 값 없음
- boolean : true, false
- int : 32비트 부호있는 정수
- long : 64비트 부호있는 정수
- float : 단일 정확도(32비트) IEEE 754부동 소수점
- double : 이중 정확도(63비트) IEEE754 부동 소수점
- bytes : 바이트 배열
- string : 유니코드 문자열
- 레코드 (record)
- 열거형 (enum)
- 배열 (array)
- 맵 (map)
- 유니온 (union)
- 고정 길이 (fixed)
name : 레코드의 이름(클래스명 또는 구조체명)
doc : 스키마에대한 설명으로 필수항목은 아님
fields :여러 개의 필드를 정의. 필드는 name, doc, type, default 속성을 가진다.
2. 복합 타입
3. 객체 컨테이너 파일
4. 프로토콜
: RPC호출을 위한 프로토콜이다. RPC호출을 위해서 프로시저에 대한 인터페이스 정의와 송수신되는 데이터에 대한 타입정의가 필요하다. 프로토콜정의는 스키마와 동일하게 JSON포맷으로 정의한다. 속성은 아래와 같다.
- protocol : 프로코콜의 이름, 코드로 생성됐을 때 인터페이스명에 해당한다.
- namespace : 네임스페이스를 한정할 수 있는 문자열로, 코드로 생성됐을때 패키지에 해당한다(선택항목)
- doc : 프로토콜에 대한 설명(선택항목)
- types : 프로토콜에서 사용하는 타입을 정의한다. 스키마에 설명한 복합 타입중 레코드, 열거형 고정 길이형이 사용되면, 추가로 에러 타입을 정의할 수 있다. 에러타입과 동일하지만 타입을 나타내는 키워드로 'error'를 사용한다. types는 선택 항목이며 쓰리프트의 'struct'에 대응하는 개념이다.
- messages : RPC메소드를 정의한다. 하나의 프로토몰 내에서는 여러 개의 메시지를 정의할 수 있다. 메시지는 쓰리프트의 'service'에 대응하는 개념이며 각 메시지는 이름과 'doc'메시지에 대한 설명, 'request' : 입력 파라미터 목록으로 'name', 'type'속성을 가진다., 'response'반환 타입을 정의한다., 'errors'예외타입 목록을 정의한다.