8. Memahami Sintaks Dasar File Protobuf
Protobuf, atau Protocol Buffers, adalah format serialisasi data milik Google yang kini telah menjadi standar de facto untuk komunikasi data yang cepat, efisien, dan terstruktur. Bila Anda sudah pernah bekerja dengan REST API dan JSON, Anda pasti merasakan betapa mudahnya bekerja dengan data berstruktur. Namun, di balik kemudahan tersebut, ada trade-off dalam hal size dan parsing speed. Di sinilah Protobuf hadir, membawa efisiensi pada level yang lebih tinggi.
Di artikel ini, kita akan membedah sintaks dasar file Protobuf (.proto
), mendalami struktur pesan, tipe data, dan berbagai fitur penting lainnya—plus mencantumkan contoh kode, tabel, hingga workflow diagram untuk memperkuat pemahaman.
Mengapa Perlu Memahami File .proto
?
File Protobuf adalah blueprint data kita: di sini kita mendefinisikan struktur pesan, tipe data, dan cara layanan saling memanggil (service definition, jika memakai gRPC). Pemahaman yang baik akan sintaks file .proto
mempercepat debugging, migrasi, serta pengembangan fitur baru pada sistem yang polyglot.
1. Anatomy File .proto
Mari kita mulai dengan kerangka sederhana sebuah file Protobuf.
syntax = "proto3";
package tutorial;
message User {
int32 id = 1;
string name = 2;
bool is_active = 3;
}
Penjelasan singkat per bagian:
Bagian | Keterangan |
---|---|
syntax | Versi bahasa Protobuf (proto2 /proto3 ). Disarankan selalu pakai proto3 . |
package | Nama package/proyek, berguna utk namespace otomatis pada hasil kode. |
message | Struktur data (object) yang akan diserialisasi/deserialisasi |
Field | Definisi atribut dalam message: tipe, nama, dan tag number |
2. Tipe Data Dasar
Protobuf sudah menyediakan banyak tipe bawaan. Berikut tabel ringkasnya:
Tipe Protobuf | Tipe pada Bahasa Pemrograman | Keterangan |
---|---|---|
double | double (float64) | Angka pecahan presisi ganda |
float | float (float32) | Angka pecahan presisi tunggal |
int32, int64 | int, long | Bilangan bulat signed |
uint32, uint64 | unsigned int, unsigned long | Bilangan bulat unsigned |
sint32, sint64 | int, long | Signed int, encoded Zigzag |
fixed32, fixed64 | int/long (fixed bytes) | Nilai tetap, presisi penting |
bool | boolean | Nilai benar/salah |
string | string | Unicode UTF-8 |
bytes | byte[] | Data biner mentah |
Untuk setiap field, Anda wajib menentukan tipe, nama, dan tag number. Contoh:
string email = 4;
Tag number unik per field karena dipakai saat serialize
di wire (range 1 - 2^29).
3. Memahami Message dan Nested Message
Pesan (message
) bisa nested, artinya message di dalam message. Misal:
message Address {
string street = 1;
string city = 2;
}
message User {
int32 id = 1;
string name = 2;
Address address = 3;
}
Protobuf mendukung train composition, sama seperti OOP di banyak bahasa; gunakanlah saat Anda ingin reusabilitas tipe.
4. Repeated Field (Array/List)
Jika satu entitas bisa punya banyak item, gunakan repeated
.
message User {
repeated string hobbies = 1;
}
repeated
berarti field ini representasi array/list.
Simulasi Encoding Misalnya kita kirim data berikut:
{
"hobbies": ["cycling", "reading", "gaming"]
}
Serialized biner Protobuf akan efisien, jauh lebih hemat dari JSON.
5. Enum
Kadang, kita ingin field hanya boleh diisi salah satu dari sekian value yang ada. Enum adalah solusinya.
enum Status {
UNKNOWN = 0;
ACTIVE = 1;
SUSPENDED = 2;
}
message User {
int32 id = 1;
Status status = 2;
}
Nilai enum selalu dimulai dari nol. Ini penting untuk default value.
6. Map (Dictionary/Associative Array)
Sejak proto3, map<key, value>
diizinkan. Contoh:
message User {
map<string, string> metadata = 4;
}
Anda bisa menyimpan data dinamis seperti key-value dalam satu field.
7. Service dan RPC (opsional)
Di dunia modern, file protobuf kerap memuat kontrak RPC (gRPC).
service UserService {
rpc GetUser (UserRequest) returns (UserResponse);
}
Hasil generate code akan menyediakan client dan server stub otomatis.
8. Simulasi: Definisikan Pesan Siswa
Mari kita buat file .proto
sederhana untuk aplikasi sekolah.
syntax = "proto3";
package sekolah;
enum Gender {
UNKNOWN = 0;
MALE = 1;
FEMALE = 2;
}
message Address {
string jalan = 1;
string kota = 2;
}
message Siswa {
int32 id = 1;
string nama = 2;
Gender gender = 3;
repeated string hobi = 4;
Address alamat = 5;
map<string, int32> nilai = 6;
}
Penjelasan:
- Gunakan enum untuk Gender agar konsisten
- Address reusable bila Siswa dan Guru memakai tipe yang sama
- Nilai map untuk menyisipkan beberapa nilai pelajaran
9. Skema ke Binary: Alur Kerja Protobuf
Mari lihat workflow dari mendefinisikan .proto
hingga digunakan di aplikasi:
flowchart LR A[Buat File .proto] --> B["Generate Code (protoc)"] B --> C["Import ke Aplikasi (Go / Java / Python / dll)"] C --> D[Serialisasi Data] D --> E[Transmisikan Lewat Jaringan] E --> F[Deserialisasi di Sisi Penerima] F --> G[Data Terpakai di Aplikasi]
10. Best Practices
- Nama field sebaiknya snake_case: Agar tidak bentrok saat di-generate di berbagai bahasa.
- Gunakan tag number konsisten: Sekali publish tag, jangan diubah—ganti nama tidak masalah, asal tag number tetap.
- Berikan default value dengan bijak: Perlu diingat, proto3 tidak support explicit default (default-nya 0/empty), gunakan enum
UNKNOWN
untuk menyiasati. - Enum selalu dimulai dari 0: Untuk backward/forward compatibility
- Refactor bertahap: Jika harus menghapus field, beri prefix
reserved
supaya aman.
Contoh reserved
:
message Siswa {
reserved 7, 8, 9;
reserved "telepon", "email";
}
Kesimpulan
Memahami sintaks dasar file Protobuf adalah investasi penting demi membangun komunikasi data antarsistem yang kuat, cepat, dan hemat traffic. Dengan penguasaan tipe data, message, enum, repeated, hingga map serta best practices, engineer dapat mendesain API, schema data, hingga kontrak RPC yang robust dan maintainable.
Billa penasaran, langsung coba buat file .proto
-mu sendiri, generate kode di bahasa pilihan, dan bandingkan performanya dengan JSON atau XML. Saya yakin Anda bakal melihat sensasi baru dalam kolaborasi data lintas platform!
7 Menulis File `.proto` Pertama Anda
Artikel Terhangat
13 Implementasi Unary RPC
06 Jun 2025
12 Membuat Client gRPC Pertama Anda
06 Jun 2025
11 Membuat Server gRPC Pertama Anda
06 Jun 2025
9 Meng-Generate Kode Go dari File Protobuf
06 Jun 2025
8 Memahami Sintaks Dasar File Protobuf
06 Jun 2025

13 Implementasi Unary RPC

12 Membuat Client gRPC Pertama Anda

11 Membuat Server gRPC Pertama Anda

9 Meng-Generate Kode Go dari File Protobuf
