IDL 가이드
득팩은 .deuk(네이티브)와 .thrift·.proto 를 입력으로 받습니다. 여기서는 메시지·타입을 정의하는 데 필요한 IDL 문법을 Thrift·Protobuf 수준으로 정리합니다.
1. 파일과 네임스페이스
진입 파일: 코드 생성 시 지정하는 루트 IDL 하나 (예: schema.deuk, api.thrift). 이 파일과 include 하는 모든 파일이 한 AST로 합쳐집니다.
네임스페이스 (생성 코드의 패키지/네임스페이스에 대응):
namespace csharp MyApp.Protocol
namespace cpp myapp.protocol
.deuk 에서는 동일 문법 또는 namespace * MyApp 처럼 공통 네임스페이스를 쓸 수 있습니다. 생성되는 C#/C++ 타입의 네임스페이스/패키지가 여기서 정해집니다.
2. 기본 타입
| IDL 타입 | 설명 | C# 대응 | C++ 대응 |
|---|---|---|---|
bool |
참/거짓 | bool |
bool |
byte |
8비트 부호 없음 | byte |
uint8_t |
i16 |
16비트 정수 | short |
int16_t |
i32 |
32비트 정수 | int |
int32_t |
i64 |
64비트 정수 | long |
int64_t |
double |
64비트 부동소수 | double |
double |
string |
UTF-8 문자열 | string |
std::string |
binary |
바이트 배열 | byte[] |
std::string / 버퍼 |
3. 구조체 (struct)
메시지·DTO는 struct 로 정의합니다. 필드마다 필드 ID(숫자)를 부여해야 하며, 나중에 필드를 추가·삭제할 때 스키마 진화에서 이 ID가 사용됩니다.
struct DemoPoint {
1: i32 x
2: i32 y
}
struct DemoUser {
1: i32 id
2: string name
3: DemoPoint home // 중첩 구조체
}
- 필드 ID: 1, 2, 3, … — 프로토콜에서 필드 식별에 사용. 한 번 배정한 ID는 변경하지 않는 것이 안전합니다.
- 선택 필드: 문법에 따라
optional등이 지원될 수 있습니다. (구현·버전에 따라 상이 — 코어 저장소 docs 참고.) - 기본값: IDL에서 기본값을 지정하면 생성 코드·스키마에 반영됩니다.
4. 열거형 (enum)
enum Status {
Unknown = 0
Active = 1
Inactive = 2
}
struct Item {
1: i32 id
2: string name
3: Status status = Status.Unknown
}
enum 값(숫자)은 직렬화 시 그대로 쓰이므로, 기존에 쓰이던 값을 바꾸지 않는 것이 좋습니다.
5. 컨테이너: list, set, map
struct Example {
1: list<i32> ids
2: list<string> tags
3: set<string> uniqueNames
4: map<i32, string> idToName
}
- list: 순서 있는 목록.
- set: 유일한 값들의 집합.
- map: 키-값 쌍. 키 타입은 정수·문자열 등 프로토콜에서 지원하는 타입.
6. include — 여러 파일로 나누기
한 파일에서 다른 IDL 파일을 가져올 때 include 를 씁니다. 코드 생성 시 include 경로 (-I)를 지정해야 합니다.
// api.thrift
include "shared.thrift"
struct Request {
1: i32 id
2: shared.CommonHeader header
}
npx deukpack ./api.thrift ./gen -I ./idl --csharp --cpp
진입 파일은 api.thrift, shared.thrift 는 -I ./idl 아래에서 찾습니다.
7. .deuk vs .thrift vs .proto
| 항목 | .deuk | .thrift | .proto |
|---|---|---|---|
| 역할 | 득팩 네이티브 | Apache Thrift 호환 | Protobuf 호환 |
| 혼합 | 한 빌드에서 .deuk + .thrift + .proto include 가능 | ||
| 문법 | Thrift와 유사 + table 등 확장 | Thrift 표준 | Protobuf 표준 |
기존 .thrift·.proto 파일은 그대로 include 하고, 새로 작성할 때는 .deuk 를 쓰면 확장 문법(테이블·메타 등)을 쓸 수 있습니다. 상세는 코어·엔진과 GitHub docs를 참고하세요.