4.4 KiB
🚀 Dynamic SOA Mapper (Configuration-Driven Payload Engine)
📖 Apa itu Dynamic SOA Mapper?
Dalam sistem integrasi perbankan/Enterprise, memetakan data internal ke format JSON yang diminta oleh Service Oriented Architecture (SOA) seringkali memakan waktu. Jika ada 100+ jenis transaksi (Kotran) dan setiap Kotran memiliki 30-40 field, melakukan hardcode menggunakan if-else di Java akan menghasilkan spaghetti code yang sulit di-maintain.
Dynamic SOA Mapper memecahkan masalah ini dengan pendekatan Metadata-Driven Architecture. Alih-alih menulis aturan mapping di dalam kode Java, seluruh aturan transformasi, operasi matematika, hingga pembentukan JSON berjenjang (nested JSON) disimpan di dalam tabel Database.
Jika ada perubahan format dari SOA, tim operasional cukup mengubah data di tabel konfigurasi tanpa perlu melakukan kompilasi kode atau deployment ulang (Zero Downtime).
✨ Fitur Utama
- 100% Dynamic Rules: Menggunakan Spring Expression Language (SpEL) untuk memanipulasi data (string concatenation, matematika, ternary operator, format tanggal) langsung dari teks di database.
- Auto Nested-JSON (Dot Notation): Mendukung pembuatan JSON bertingkat tanpa mengubah struktur tabel. Cukup gunakan notasi titik pada konfigurasi (contoh:
header.message.id), engine akan otomatis merakit objek JSON-nya. - High Performance (SpEL Caching): Aturan SpEL di-parse dan disimpan dalam ConcurrentHashMap In-Memory Cache. Eksekusi mapping berjalan dalam hitungan mikrosekon (O(1)).
- Resilient & Fail-Safe: Dilengkapi dengan fitur Safe Navigation (mencegah NullPointerException), kolom Default Value (fallback jika data kosong), dan validasi Mandatory Field.
🏗️ Arsitektur & Cara Kerja
Saat endpoint API dipanggil dengan membawa transactionId dan kotran:
- Data Aggregation: Sistem menarik data sumber (
TransactiondanPayment) dari database dan membungkusnya ke dalamStandardEvaluationContext. - Fetch Configuration: Sistem mengambil daftar aturan mapping khusus untuk
kotrantersebut dari tabelSOA_MAPPING_CONFIG. - SpEL Evaluation: Engine melakukan iterasi pada setiap aturan, mengeksekusi
expression_ruleterhadap Context data sumber. - JSON Assembly: Hasil evaluasi dirakit menjadi Map (mendukung nested berkat notasi titik) dan dikembalikan sebagai representasi JSON siap kirim.
💻 Panduan Penggunaan & Konfigurasi
1. Struktur Tabel Konfigurasi (SOA_MAPPING_CONFIG)
Ini adalah jantung dari project ini. Memahami cara mengisi tabel ini berarti menguasai seluruh mapping.
| Kolom | Penjelasan | Contoh Pengisian |
|---|---|---|
KOTRAN |
Kode transaksi sebagai pengelompokan rules. | 1001, 1002, POS_PAYMENT |
TARGET_FIELD_NM |
Nama key JSON tujuan. Gunakan titik (.) untuk nested object. |
TLBF01 atau header.msgId |
TARGET_FIELD_TYPE |
Tipe data target (saat ini sebagai referensi dokumentasi). | String, Number |
EXPRESSION_RULE |
Aturan SpEL untuk mengambil/mengubah data dari objek sumber. | #transaction.amount * 100 |
DEFAULT_VALUE |
Nilai fallback jika hasil evaluasi rule menghasilkan null. |
0, NO_DATA |
IS_MANDATORY |
1 (Wajib). Jika evaluasi dan default null, sistem akan error. 0 (Opsional). |
1, 0 |
2. Cheatsheet Penulisan Expression Rule (SpEL)
Dalam project ini, objek yang didaftarkan ke dalam Context adalah #transaction dan #payment.
- Mapping Langsung:
#payment.debitAccountNo - Hardcode Value:
'PT BUMI MAKMUR'(Gunakan kutip satu) - Operasi Matematika:
#transaction.amount * 15000 - Konkatenasi String:
'REF-' + #transaction.id - Format Tanggal:
new java.text.SimpleDateFormat('yyyyMMdd').format(#transaction.effectiveDate) - Ternary Operator (If-Else):
#transaction.status == 'SUCCESS' ? '00' : '99' - Safe Navigation (Anti-NPE):
#transaction?.promoCode(Gunakan?.jika curiga field tersebut bisa null)
🚀 Cara Menjalankan Aplikasi Lokal
Prasyarat:
- Java 17 atau lebih baru
- Maven 3.x
- Database Oracle (atau ubah URL di
application.yamljika menggunakan database lain)
Langkah-langkah:
- Pastikan database Oracle menyala dan konfigurasi di
src/main/resources/application.yamlsudah sesuai dengan username dan password lokalmu. - Jalankan perintah Maven:
./mvnw spring-boot:run