Clean Architecture dalam Pengembangan Aplikasi Go

Clean Architecture adalah pendekatan arsitektur perangkat lunak yang bertujuan untuk membuat sistem lebih terstruktur, mudah diuji, dan scalable. Dengan menggunakan Clean Architecture, kode aplikasi dipisahkan menjadi beberapa lapisan yang memiliki tanggung jawab masing-masing. Artikel ini akan membahas konsep, prinsip, dan implementasi Clean Architecture dalam pengembangan aplikasi menggunakan bahasa Go.
Apa Itu Clean Architecture?
Clean Architecture diperkenalkan oleh Robert C. Martin (Uncle Bob) sebagai pendekatan yang memungkinkan aplikasi tetap fleksibel, modular, dan mudah dikembangkan. Clean Architecture berfokus pada pemisahan antara logika bisnis inti dengan detail implementasi seperti framework, database, atau UI.
Prinsip utama dari Clean Architecture meliputi:
- Independensi Framework: Aplikasi tidak bergantung pada framework tertentu.
- Independensi Database: Aplikasi tidak terikat pada teknologi database tertentu.
- Independensi UI: Antarmuka pengguna dapat diganti tanpa mempengaruhi logika bisnis.
- Testability: Setiap komponen dapat diuji secara terpisah.
- Dependency Rule: Lapisan dalam tidak boleh bergantung pada lapisan luar.
Struktur Clean Architecture dalam Go
Dalam pengembangan aplikasi dengan Go, Clean Architecture umumnya dibagi menjadi beberapa lapisan berikut:
- Entity (Domain Layer)
- Berisi model data dan aturan bisnis inti aplikasi.
- Use Case (Application Layer)
- Menyediakan logika bisnis utama dan berinteraksi dengan repository.
- Repository (Infrastructure Layer)
- Mengelola akses data dari database atau sumber lain.
- Delivery (Interface Layer)
- Menangani komunikasi dengan pengguna, seperti HTTP handler.
Implementasi Clean Architecture dalam Aplikasi Go
1. Membuat Entity (Domain Layer)
package entity
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
2. Membuat Repository Interface
package repository
import "myapp/entity"
type UserRepository interface {
GetByID(id int) (*entity.User, error)
Create(user *entity.User) error
}
3. Implementasi Use Case
package usecase
import (
"myapp/entity"
"myapp/repository"
)
type UserUseCase struct {
userRepo repository.UserRepository
}
func (u *UserUseCase) GetUser(id int) (*entity.User, error) {
return u.userRepo.GetByID(id)
}
4. Implementasi Handler (Delivery Layer)
package handler
import (
"net/http"
"strconv"
"github.com/labstack/echo/v4"
"myapp/usecase"
)
type UserHandler struct {
userUC *usecase.UserUseCase
}
func (h *UserHandler) GetUser(c echo.Context) error {
id, _ := strconv.Atoi(c.Param("id"))
user, err := h.userUC.GetUser(id)
if err != nil {
return c.JSON(http.StatusNotFound, map[string]string{"error": "User not found"})
}
return c.JSON(http.StatusOK, user)
}
Kesimpulan
Dengan menerapkan Clean Architecture dalam pengembangan aplikasi Go, kita dapat menjaga modularitas, fleksibilitas, dan kemudahan pemeliharaan kode. Setiap lapisan memiliki tanggung jawabnya sendiri, sehingga memungkinkan pengembangan yang lebih terstruktur dan scalable.