Skip to main content

Command Palette

Search for a command to run...

Hexagonal Architecture dengan Golang dan Implementasinya pada Sistem Manajemen Rumah Sakit

Updated
3 min read

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:

  1. Domain / Core – berisi logika bisnis inti.

  2. Ports – interface yang mendefinisikan cara domain berinteraksi dengan dunia luar.

  3. 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.

22 views