tutorial

45 Cara Menggunakan option di Protobuf

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:

ScopeContoh OptionContoh Penulisan di .proto
Filejava_packageoption java_package = "com.blog";
Messagemessage_set_wire_formatoption (xyz.my_opt) = true;
Fielddeprecated, json_namestring username = 1 [deprecated=true];
Enum/EnumValallow_aliasoption 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:

  1. Engineer menulis .proto dan mengisi option pada berbagai scope.
  2. protoc compiler membaca option.
  3. Untuk standard option, code generator resmi menerapkan behaviour.
  4. 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

OptionTingkatTujuan
java_packageFileNamespace hasil code di Java
go_packageFileNamespace hasil code di Go
deprecatedFieldMenandai field/class tidak disarankan dipakai lagi
json_nameFieldNama alternatif saat serialisasi JSON
allow_aliasEnumAllow duplikasi nomor enum
**(sensitive) (custom)FieldMetadata 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!

comments powered by Disqus