Apache Thrift 개요

Apache Thrift 개요

Apache Thrift는 RPC(원격 프로 시저 호출) 프레임워크이다. Facebook에서 개발해서 2007년 4월에 오픈소스가 되었고, 2008년 5월 Apache Incubator에 들어가 2010년 11월 아파치 TLP(Top-Level Project)가 되었다. Thrift는 강력하고 바이너리 전송이 빠르다.
Apache Thrift - Home

Apache Thrift 설치

Thrift 설치는 아래 문서에서 찾아볼 수 있다.
http://wiki.apache.org/thrift/ThriftInstallation

Ubuntu에서 설치

Ubuntu 설치 단계를 요약하면 아래와 같다.

  1. 필요한 종속성을 설치합니다.
    $ sudo apt-get install libboost-dev libboost-test-dev \
    libboost-program-options-dev libevent-dev automake libtool flex bison \
    pkg-config g++ libssl-dev
    
  2. 설치 루트 디렉터리로 이동한다.
  3. $ ./configure
  4. $ make
  5. 슈퍼 유저를 아래 명령어 실행한다.
    $ make install
    

Mac에서 설치

Mac 환경에서 Homebrew으로 아래 명령어로 설치할 수 있다.

% brew update
% brew install thrift

Apache Thrift IDL

Thrift에서는 IDL(Interface Description Language 또는 Interface Definition Language)로 인터페이스를 정의하여, 각 언어별로 소스 코드를 생성하여 구현한다.

지원되는 언어는 As3, C Glib, C++, CSharp, D, Delphi, Erlang, Go, Graphviz, Haskell, Java, Java Me, Javascript, Node.js, Objective-c, OCaml, Perl, PHP, Python, Ruby, Smalltalk 등 24여개가 있다.
Apache Thrift - Language and Feature Matrix

여기에서는 Thrift의 IDL에 대해 설명한다.

사용 가능한 유형

Thrift에 기본형, 컨테이너형, 구조체, 예외형, 열거형, 공용체의 6종류를 사용할 수 있다.

기본형

Type 설명
bool Boolean, one byte.
논리 값, true 또는 false.
byte Signed byte.
1byte 정수.
i16 Signed 16-bit integer.
2byte 정수.
i32 Signed 32-bit integer.
4byte 정수.
i64 Signed 64-bit integer.
8byte 정수.
double 64-bit floating point value.
8byte 부동 소수점.
string String.
UTF8로 인코딩된 문자열.
binary Blob (byte array)
인코딩되지 않은 바이드 데이터.

컨테이너 타입

Type 설명
map<t1,t2> Map from one type to another.
고유한 키와 값의 조합.
C++ STL map, Java HashMap, PHP 연관 배열, Python/Ruby dictionary와 동의어
list<t1> Ordered list of one type.
순서가 없는 고유한 요소 목록.
C++의 STL 세트, Java의 HashSet, Pytyon의 set과 동의어
set<t1> Set of unique elements of one type.
순서가 지정된 요소의 목록.
C++의 STL vector, Java의 ArrayList 및 스크립팅 언어의 배열과 동의어

컨테이너형의 정의는 c++의 사용법과 같다. 이하에 정의 예제이다.

struct ExampleContainerDefinition
{
  1:map<i32, string> mapexample,
  2:set<i32> setexample,
  3:list<i32> listexample
}

구조체

Thrift의 구조체는 C 언어의 구조체와 매우 유사하다. 일반적인 선언은 다음과 같이 수행된다.

struct ExampleStructure
{
  1:i32 id,
  2:string message
}

앞에 기재된 값(1,2)는 FieldID 라고 한다. 이 FieldID는 구조 내에서 고유한 값이어야 하며 서버 클라이언트 모두에서 구조 정의가 일치하는지 확인하기 위한 것이다. (다른 구조체 내에 동일한 ID가 있을 수 있다.)

그 밖에도 초기값의 설정이나 구조체의 데이터의 정의가 필요할지, 임의인지를 정의하는 것이 가능하다. 초기값은 필드명 이후에 = 정수을 지정하는 할 수 있다. 구조체의 필드의 필수 여부는 required을 기입할 수 있고, 임의의 경우에는 optional을 지정한다.

struct ExampleStructure
{
  1: required i32 id,
  2: optional string message="default"
}

예외형

구조체와 마찬가지로 예외에서 사용되는 유형도 정의 할 수 있다.

exception exampleException 
{
  1:i32 errorcode,
  2:string message
}

열거형

Thrift에서도 열거형을 사용할 수 있다. 열거형은 0부터 순서대로 값이 부여되지만, 임의의 값을 정의하는 것도 가능하다.

enum exampleEnum1 {
  EnumA,
  EnumB,
  EnumC
}

enum exampleEnum2 {
  ONE = 1,
  TWO,
  FIVE = 5
}

고용체

공용체는 구조체와 동일한 정의를 수행하지만 구조체와 다르다.
공용체는 정의된 복수의 필드 중에서 하나의 필드 밖에 사용할 수 없다. Thrift 공용체는 C++ 공용체와 같다.

또한, 위의 이유로 공용체 필드에 required를 사용할 수 없다.

Services

Thrift로 정의하는 Service는, interface 클래스와 같은 것이다. Service 중에는 메소드의 집합을 정의한다.

service exampleService 
{
  void set(1:i32 key,2:string value),
  string get(1:i32 key) throws (1:i32 errorcode),
  i32 size()
}

Method

Thrift에서는 Service 내에 메소드를 정의할 수 있다.
Method는 Thrift가 정의 할 수 있는 유형과 void를 사용할 수 있다.
그리고, 인수에는 구조체의 선언과 마찬가지로 Method의 인수 내에서 고유한 FieldID의 정의가 필요하다.

Exception

Thrift에서는 예외를 정의할 수도 있다.

예외의 정의 예는 아래와 같다.

exception exampleException1 
{
  1:i32 errorcode,
  2:string message
}

service exampleService 
{
  void testException1(1:string arg) throws(1:exampleException1 error),
  void testException2(1:string arg) throws(1:exampleException1 error, 2:i32 error2)
}

위의 testException2와 같이 여러 예외를 정의하는 것도 가능하다.

oneway method

Service 내에서 정의하는 메소드 중 응답을 기다릴 필요가 없는 메소드도 정의 할 수 있다.

oneway method를 사용하는 경우, 반환값은 반드시 void이어야 한다.

service exampleService
{
  oneway void show()
}

기타 Thrift 규칙

여기서는 Thrift 정의 파일의 기술 규칙에 대해 설명한다.

주석

코멘트는 다음과 같이 작성할 수 있다.

/*
 주석
*/

// 주석

헤더

헤더에는 include, cpp_include, namespace 이렇게 3가지 종류를 사용할 수 있다.

include

include는 다른 thrift 파일을 사용할 때 사용한다. include “example.thrift"라는 바람으로 정의한다.

cpp_include

C++ 포함하려면, Thrift에 C++ 코드 생성기의 출력에 사용자 지정 C++ 포함을 추가한다.다.

namespace

namespace는 파일내에서 정의한 구조체나 열거형, Service가 속하는 namespace를 결정한다.
namespace는 아래와 같이 정의하고, cpp의 곳에는 php나 java등이 들어간다.

네임스페이스에 특이한 점은 각 언어에 대해 정의되어야 한다는 것이다.

namespace cpp hoge
namespace java hoge

상수

Thrift의 정의 내에서 상수를 정의하는 것이 가능하다.

상수 선언은 유형 이름 앞에 const를 부여하기만 하면 된다.

const EXAMPLE_VALUE = 1

Typedef

Thrift의 정의 내에서 타입명을 변경하는 것이 가능하다.

타입명의 변경은 타입 앞에 typedef를 부여하면 된다.

typedef ExampleType i32

필드 이름 명명 규칙

필드명에 사용할 수 있는 것은 영문, 숫자와 _,.으로 지정할 수 있다. 필드의 첫 글자는 반드시 영어 또는 _이 아니면 안된다.

참조




최종 수정 : 2024-01-18