Hexagonal Architecture di Android Kotlin (Part 2)

Muhammad Hadi Lo
4 min readApr 14, 2021

Sangat direkomendasikan membaca terlebih dahulu Part 1 MVVM untuk penjelasan Model-View-ViewModel yang digunakan pada artikel

Part 2 Hexagonal Architecture

Hexagonal Architecture yang juga dikenal sebagai Port Adapter Architecture merupakan salah satu dari Clean Architecture.

The Hexagonal Architecture, a clean architecture pattern also known as Ports and Adapters.

Port merepresentasikan interface (di java / kotlin), sedangkan Adapter merepresentasikan class yang mengimplementasikannya.

Untuk memahami hexagonal secara mudah cukup mengikuti 2 aturan yaitu:

  1. Semua komunikasi antar class atau antar module harus melalui port (interface)
  2. Primary/Driving Adapters → Business Logic ← Secondary/Driven Adapters

Apabila ingin mengetahui hexagonal lebih dalam silakan cek link

Hexagonal

Secara umum konsep dari hexagonal adalah seperti pada gambar Hexagonal Rule.

Hexagonal Rule

Primary/Driving Adapters depend on Business Logic sedangkan Secondary/Driven Adapters depend on Business Logic.

Primary/Driving adalah class atau module yang berperan aktif dalam tindakan. Misalnya user nge-klik tombol, user melihat value dari tampilan, dsb.

Business Logic adalah kumpulan logic yang terbebas dari dependency library 3rd party. Sehingga apabila kita ingin shared code dengan ios (Kotlin Multiplatform Mobile), maka tidak ada dependency yang menjadi blocker saat developement iOS-nya.

Secondary/Driven adalah class atau module yang berperan pasif menunggu trigger dari Primary/Driving. Misal mengambil data dari backend.

Get data from Backend

Apabila bagian pink dan coklat diperjelas, maka seperti gambar ini.

UI merupakan Primary/Driving Adapters yang di dalamnya terdapat layout. Contohnya HomeFragment. HomeViewModel juga merupakan entitas dari UI karena viewmodel di Android disini berperan sebagai lifececyle handler. Dan kita menganut one layout one viewmodel. Maka lebih tepat viewmodel diletakkan di ui.

Core sendiri bisa disebut business logic. Di dalam core terdapat service (atau sebagian developer menyebut usecase), tempat untuk meletakkan class logic kita. Terdapat dua interface yang disebut di Hexagonal sebagai Port. Yaitu IProductService dan ProductReadRepositoryPort. Masih ingat Hexagonal Rule ?

Network merupakan Secondary/Driven Adapters. Yang berhubungan langsung dengan library 3rd party.

Yuk kita lihat contoh code-nya.

Service

Pertama kita membuat Port service, kita beri nama IProductService. Lalu kita bikin Adapter dengan nama ProductService. Port dan Adapternya letakkan di core. ProductService depend on ProductReadRepositoryPort dan ISessionService. Service bisa depend on service lain.

Network Repository

Netwotk Repository bertugas untuk mengambil data dari backend dan berhubungan langsung dengan 3rd party. Kita bikin Port-nya dengan nama ProductReadRepositoryPort letakkan di core.

Lalu kita bikin Adapter-nya dengan nama ProductNetworkRepositoryAdapter di network. ProductNetworkRepositoryAdapter depend on ApiService. ApiService adalah interface dari Library Retrofit.

ViewModel

Lalu kita akan memanggil service tadi di viewmodel, kita panggil IProductService. Yang kita panggil port-nya ya. Jangan adapternya. Dan tugas kita selesai untuk service network.

Get data from DB Local

Sedangkan untuk database local, struktur module-nya seperti ini.

Setelah aplikasi mendapatkan data dari backend, maka data tersebut akan disimpan di database local.

ProductDaoAdapter depend on ProductWriteRepositoryPort yang nantinya digunakan untuk menulis di database local. ProductDaoAdapter juga depend on ProductReadRepository untuk mengambil data dari backend.

Dao Repository

Kita bikin port-nya di core dengan nama ProductWriteRepositoryPort. Port ini gunanya untuk menulis / menyimpan data di database local.

Lalu kita bikin Adapternya di persistence dengan nama ProductDaoAdapter (harusnya ProductDaoRepositoryAdapter, maaf typo jauh, wkwk). ProductReadRepositoryPort digunakan untuk mengambil data dari backend dan ProductWriteRepositoryPort untuk menyimpan di database local.

ProductDaoAdapter depend on ProductReadRepositoryPort dan ProductDao. ProductDao adalah interface sqlite.

Penerapannya

Nah salah satu keuntungan menggunakan port (interface) sebagai kontraknya, yaitu kemudahan switching feature. Karena kita menggunakan Library Koin untuk Dependency Injection, maka cukup menuliskan ProductNetworkRepositoryAdapter untuk fitur hanya mengambil data dari backend.

Sedangkan untuk menggunakan fitur ambil dari backend dan menyimpannya cukup menuliskan ProductDaoAdapter.

Dari sini kita sudah bisa melihat manfaat dari Hexagonal Architecture.

Tada~ Begini penampakannya seperti ini…

Artikel ini belum selesai loh… nantikan Part 3 ya :)

Jika bermanfaat silakan share dan clap-nya :)

--

--

Muhammad Hadi Lo

Android Developer; Startup Enthusiast; Based in Malang, Kick me at Telegram @hadilomu