Hexagonal Architecture dengan Golang dan Implementasinya pada Sistem Manajemen Rumah Sakit
Pendahuluan
Dalam pengembangan perangkat lunak berskala besar seperti Sistem Informasi Manajemen Rumah Sakit (SIMRS), arsitektur aplikasi memegang peranan penting agar sistem tetap fleksibel, mudah dikembangkan, dan terukur. Salah satu pendekatan modern yang banyak digunakan adalah Hexagonal Architecture (atau dikenal juga sebagai Ports and Adapters Pattern).
Artikel ini membahas konsep dasar Hexagonal Architecture, implementasi dengan Golang, serta studi kasus penerapannya pada modul SIMRS.
Konsep Hexagonal Architecture
Hexagonal Architecture pertama kali diperkenalkan oleh Alistair Cockburn. Ide utamanya adalah memisahkan inti bisnis aplikasi (domain) dari detail teknis seperti database, API, maupun UI.
Struktur utamanya:
Domain / Core – berisi logika bisnis inti.
Ports – interface yang mendefinisikan cara domain berinteraksi dengan dunia luar.
Adapters – implementasi konkret dari ports (misalnya database adapter, REST API, gRPC, message broker, dll).
Dengan cara ini:
Logika bisnis tetap murni dan tidak terikat pada framework/teknologi tertentu.
Infrastruktur (database, UI, API) dapat diganti tanpa memengaruhi domain.
Mengapa Golang Cocok?
Golang memiliki beberapa keunggulan untuk membangun aplikasi berbasis Hexagonal Architecture:
Sederhana: Sintaks minimalis memudahkan developer memahami struktur domain.
Strong typing: Cocok untuk membuat kontrak (ports) yang jelas.
Performant: Efisien untuk sistem yang membutuhkan performa tinggi seperti SIMRS.
Ekosistem: Dukungan library untuk REST, gRPC, SQL/NoSQL, message broker, dll.
Struktur Project Hexagonal di Golang
Contoh struktur sederhana:
/simrs
/cmd
/app # main program
/internal
/domain # entity dan business logic
/ports # interface (ports)
/adapters # database, api, dll
/usecase # application services
Contoh Domain (Entity Pasien)
package domain
type Patient struct {
ID string
Name string
Age int
Address string
}
Ports (Repository Interface)
package ports
import "simrs/internal/domain"
type PatientRepository interface {
Save(patient domain.Patient) error
FindByID(id string) (domain.Patient, error)
}
Adapter (Implementasi Repository dengan Database SQL)
package adapters
import (
"database/sql"
"simrs/internal/domain"
"simrs/internal/ports"
)
type PatientRepositorySQL struct {
DB *sql.DB
}
func (r *PatientRepositorySQL) Save(p domain.Patient) error {
_, err := r.DB.Exec("INSERT INTO patients (id, name, age, address) VALUES (?, ?, ?, ?)",
p.ID, p.Name, p.Age, p.Address)
return err
}
func (r *PatientRepositorySQL) FindByID(id string) (domain.Patient, error) {
row := r.DB.QueryRow("SELECT id, name, age, address FROM patients WHERE id = ?", id)
var p domain.Patient
err := row.Scan(&p.ID, &p.Name, &p.Age, &p.Address)
return p, err
}
Use Case (Aplikasi)
package usecase
import (
"simrs/internal/domain"
"simrs/internal/ports"
)
type PatientService struct {
Repo ports.PatientRepository
}
func (s *PatientService) RegisterPatient(p domain.Patient) error {
return s.Repo.Save(p)
}
Entry Point (REST API sebagai Adapter)
package adapters
import (
"encoding/json"
"net/http"
"simrs/internal/domain"
"simrs/internal/usecase"
)
type PatientHandler struct {
Service *usecase.PatientService
}
func (h *PatientHandler) Register(w http.ResponseWriter, r *http.Request) {
var p domain.Patient
json.NewDecoder(r.Body).Decode(&p)
err := h.Service.RegisterPatient(p)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusCreated)
}
Studi Kasus: Implementasi pada SIMRS
Pada SIMRS, modularisasi sangat penting. Contoh penerapan Hexagonal Architecture:
Modul Pasien → menangani pendaftaran pasien, rekam medis.
Modul Dokter → manajemen jadwal dan data dokter.
Modul Billing → integrasi keuangan, pembayaran, asuransi BPJS.
Modul Apotek → manajemen obat, stok, dan distribusi.
Dengan Hexagonal:
Domain setiap modul berdiri sendiri.
Ports didefinisikan sebagai kontrak layanan antar modul.
Adapters bisa berupa REST API, gRPC, atau event message.
Misalnya: Modul Billing dapat mengganti database MySQL ke PostgreSQL tanpa mengubah domain. Modul Apotek dapat ditambahkan integrasi dengan mesin kasir tanpa memengaruhi logika inti.
Keuntungan untuk SIMRS
Maintainability: Sistem lebih mudah dikembangkan walau kompleks.
Scalability: Modul bisa dikembangkan paralel oleh tim berbeda.
Testability: Domain dapat diuji tanpa tergantung infrastruktur.
Flexibility: Teknologi database/API dapat diganti tanpa ubah domain.
Kesimpulan
Hexagonal Architecture memberikan fondasi yang kokoh untuk membangun SIMRS yang kompleks, fleksibel, dan terukur. Dengan menggunakan Golang, developer bisa mendapatkan performa tinggi sekaligus arsitektur yang bersih dan mudah dikembangkan.
Pendekatan ini memungkinkan setiap modul SIMRS berkembang secara independen, mudah diintegrasikan, dan tetap menjaga konsistensi logika bisnis rumah sakit.