Dalam pengembangan aplikasi, pola desain yang baik sangat penting untuk menjaga kebersihan, keterbacaan, dan pemeliharaan kode. Salah satu pola yang sering digunakan adalah pola Controller-Service-Repository. Artikel ini akan membahas struktur dan cara kerja pola ini, serta memberikan contoh implementasi.
Apa Itu Controller-Service-Repository?
Pola Controller-Service-Repository membagi aplikasi menjadi tiga lapisan utama:
- Controller: Bertanggung jawab untuk menangani permintaan dari pengguna, memproses data, dan mengembalikan respons.
- Service: Berfungsi sebagai penghubung antara controller dan repository, berisi logika bisnis aplikasi.
- Repository: Bertanggung jawab untuk interaksi dengan sumber data, seperti database.
Contoh Kode
Berikut adalah contoh kode sederhana menggunakan pola ini dalam aplikasi berbasis Node.js dengan Express dan Sequelize:
// Controller
class UserController {
constructor(userService) {
this.userService = userService;
}
async getUser(req, res) {
try {
const user = await this.userService.findUserById(req.params.id);
res.json(user);
} catch (error) {
res.status(500).send(error.message);
}
}
}
// Service
class UserService {
constructor(userRepository) {
this.userRepository = userRepository;
}
async findUserById(id) {
return await this.userRepository.getById(id);
}
}
// Repository
class UserRepository {
constructor(database) {
this.database = database;
}
async getById(id) {
return await this.database.User.findByPk(id);
}
}
Analisis dan Penjelasan
1. Memisahkan Tanggung Jawab
Pola ini memisahkan tanggung jawab setiap komponen, yang membuat kode lebih modular dan mudah dipahami. Controller fokus pada interaksi pengguna, service pada logika bisnis, dan repository pada akses data. Dengan pemisahan ini, setiap komponen bisa dikembangkan dan diuji secara independen.
2. Menggunakan Dependency Injection
Dalam contoh di atas, kita menggunakan dependency injection untuk menyuntikkan userService
ke dalam UserController
, dan userRepository
ke dalam UserService
. Ini membuat kode lebih fleksibel dan lebih mudah untuk diuji unit.
3. Praktik Baik
- Uji Unit: Dengan memisahkan logika bisnis dari kontroler, kita dapat menulis uji unit untuk setiap lapisan tanpa tergantung pada lapisan lainnya.
- Reusable Code: Service dan repository dapat digunakan kembali di berbagai controller tanpa perlu duplikasi kode.
- Keterbacaan: Struktur kode yang bersih dan terorganisir memudahkan pengembang baru untuk memahami aplikasi.
Kesimpulan
Pola Controller-Service-Repository adalah praktik terbaik dalam pengembangan aplikasi yang memudahkan manajemen kode dan mempercepat proses pengembangan. Dengan memisahkan tanggung jawab dan menggunakan dependency injection, kita dapat menciptakan kode yang tidak hanya efisien tetapi juga mudah untuk dipelihara. Jika Anda baru memulai dengan pola ini, mulailah dengan proyek kecil dan tingkatkan kompleksitas seiring dengan meningkatnya pemahaman Anda.
Sumber Daya Berguna
Dengan memahami dan mengimplementasikan pola Controller-Service-Repository, Anda akan meningkatkan kualitas aplikasi yang Anda bangun. Selamat coding!