Salah satu fitur powerful dari Protocol Buffers (Protobuf) yang sering terlupakan oleh banyak engineer adalah penggunaan option
. Memahami dan memaksimalkan opsi di Protobuf bisa sangat membantu dalam mendesain kontrak API yang lebih fleksibel dan maintainable. Dalam artikel ini, saya akan mengulas tuntas apa itu option
, cara menggunakannya, contoh penerapannya pada berbagai level, hingga menulis option kustom sendiri, lengkap dengan contoh kode, simulasi kasus nyata, tabel referensi, dan diagram alur.
Mengenal option
di Protobuf
Sebelum masuk ke contoh kode, mari kita bahas secara singkat—apa itu option
?
option
di Protobuf adalah sebuah fitur metadata yang dapat dipasang pada berbagai entitas seperti file, message, field, enum, dan service. Fungsinya adalah memberikan instruksi khusus kepada code generator (misal protoc
) atau alat lain yang membaca schema Protobuf.
Beberapa contoh option yang sering kita jumpai diantaranya:
java_package
deprecated
json_name
default
🎯 Intinya: option menjadi instruksi tambahan di file .proto tanpa mempengaruhi isi message secara langsung, tetapi dapat mengubah perilaku sertaan di language-specific code, dokumentasi, atau alat terkait.
Penempatan dan Scope option
Option dapat diletakkan di berbagai level. Mari kita lihat tabel berikut untuk ringkasannya:
Scope | Contoh Option | Contoh Penulisan di .proto |
---|---|---|
File | java_package | option java_package = "com.blog"; |
Message | message_set_wire_format | option (xyz.my_opt) = true; |
Field | deprecated , json_name | string username = 1 [deprecated=true]; |
Enum/EnumVal | allow_alias | option allow_alias = true; |
Service | - | option deprecated = true; |
Custom | [custom options] | option (my_custom) = "value"; |
Contoh-contoh Option Bawaan
Mari kita masuk ke kode nyata. Kita gunakan .proto
file untuk mendemokan beberapa option built-in paling berguna.
syntax = "proto3";
option java_package = "com.medium.protobuf";
option go_package = "github.com/username/project/proto";
message User {
string name = 1;
int32 age = 2 [deprecated = true];
string email = 3 [json_name = "userEmail"];
}
enum Status {
option allow_alias = true;
UNKNOWN = 0;
ACTIVE = 1;
ENABLED = 1;
}
Penjelasan kode:
java_package
&go_package
mengatur namespace hasil code generator di Java/Go.- Field option pada
age
menandai bahwa field tsb sudah deprecate, baik pada dokumentasi maupun runtime code. json_name
mempengaruhi hasil serialisasi ke json.- Pada enum, option
allow_alias = true
membolehkan dua enum value (ACTIVE, ENABLED) sharing nomor sama.
Output Kode Otomatis
Misal pada field age
yang deprecated, hasil generate di Go (komentar di struct) akan tampil seperti ini:
// Deprecated: Do not use.
Age int32 `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty"`
Membantu tim lain supaya tahu properti ini sebaiknya dihindari.
Custom Option: Lebih dari Sekadar Metadata
Fitur yang benar-benar powerful adalah kemampuan mendefinisikan option sendiri, sehingga plugin code generator atau linter dapat membaca instruksi unik buatan kita sendiri.
1. Definisikan option
Custom
Custom options didefinisikan via proto extension dari google.protobuf
standard options.
// custom_options.proto
syntax = "proto3";
import "google/protobuf/descriptor.proto";
extend google.protobuf.FieldOptions {
string sensitive = 50001;
}
Catatan: Gunakan ID (field number) besar agar tidak bentrok dengan yang sudah ada.
2. Menggunakannya di Protobuf Schema
// user.proto
syntax = "proto3";
import "custom_options.proto";
message User {
string password = 1 [(sensitive) = "Yes"];
string email = 2;
}
Dengan ini, plugin generator khusus bisa membaca apakah sebuah field berisi value sensitive (misal: password), sehingga pada layer logging bisa otomatis di-masking.
Simulasi Alur Kerja Option (Mermaid)
Mari kita bayangkan workflow bagaimana option diproses oleh toolset Protobuf.
flowchart LR subgraph Dev A[Write .proto file] -->|Add option| B end B[Protoc Compiler] --> C{Baca option} C -->|Standard option| D[Protoc generated code] C -->|Custom option| E[Plugin / Linter] E --> F[Custom Behavior]
Penjelasan:
- Engineer menulis .proto dan mengisi option pada berbagai scope.
protoc
compiler membaca option.- Untuk standard option, code generator resmi menerapkan behaviour.
- Untuk custom option, plugin atau alat eksternal bisa melakukan automation ekstra—misal masking, validasi, pembuatan dokumentasi tambahan, dsb.
Studi Kasus: Masking Logging Otomatis
Sering terjadi, field sensitif seperti password atau token tidak di-mask saat logging request pada backend service. Dengan custom option, kita bisa otomatiskan masking ini!
1. Penandaan di .proto
message LoginRequest {
string username = 1;
string password = 2 [(sensitive) = "true"];
}
2. Implementasi di Code Generation/Plugin
Plugin Go/Node.js anda bisa membaca metadata ini:
if field.Options.Sensitive == "true" {
// Saat log request, mask field ini jadi "*****"
}
Hasilnya:
Received: {"username":"devuser","password":"*****"}
Tabel Ringkasan Contoh Option
Option | Tingkat | Tujuan |
---|---|---|
java_package | File | Namespace hasil code di Java |
go_package | File | Namespace hasil code di Go |
deprecated | Field | Menandai field/class tidak disarankan dipakai lagi |
json_name | Field | Nama alternatif saat serialisasi JSON |
allow_alias | Enum | Allow duplikasi nomor enum |
**(sensitive) (custom) | Field | Metadata khusus misal instruksi masking di logging |
Kapan Anda Harus Memakai Option?
- Ketika API lintas tim/programming language
- Ingin enforce aturan kustom (custom linter, doc generator)
- Menghendaki dokumentasi kontrak API yang lebih kaya
- Otomatisasi perilaku seperti default value, masking, deprecation
Kesimpulan
Penggunaan option
di Protobuf adalah salah satu teknik yang sangat bermanfaat dalam pengelolaan skema data & komunikasi API modern. Standar option membantu portability lintas bahasa, sedangkan custom option membuka peluang otomatisasi dan enforce semantic policy pada API perusahaan.
Mulai dari hal-hal sederhana seperti deprecate field hingga masking data sensitif, semua bisa ditata lewat option. Kode dan kontrak API Anda pun menjadi lebih bertenaga!
Jangan ragu untuk bereksperimen dengan custom option & plugin Protobuf. Dengan memahami cara kerja option, Anda bisa menciptakan API yang maintainable, future-proof, dan dipercaya seluruh tim ❤️
🚀 Ingin diskusi implementasi custom option di stack Anda? Tulis pertanyaan di comment!
22 Membuat Sub-Schema Berdasarkan Modul
Artikel Terhangat
26 Apa Itu Mutation dan Kapan Digunakan?
07 Jul 2025
48 Custom Options di Protobuf
07 Jul 2025
47 Reserved Fields dan Reserved Numbers
07 Jul 2025
23 Modularisasi File Resolver dan Skema
07 Jul 2025
45 Cara Menggunakan `option` di Protobuf
07 Jul 2025

26 Apa Itu Mutation dan Kapan Digunakan?

48 Custom Options di Protobuf

47 Reserved Fields dan Reserved Numbers

23 Modularisasi File Resolver dan Skema
