Kenapa src/ yang datar mulai berantakan begitu proyeknya punya fitur sungguhan, dan tata letak module-driven yang menggantikannya — satu direktori per fitur, dengan common, config, dan database di sampingnya.

Waktu pertama kali membuat proyek NestJS, Anda disambut struktur folder yang sederhana dan bersih. Ada app.controller.ts, app.service.ts, dan app.module.ts. Untuk proyek "Hello World", itu sudah lebih dari cukup.
Tapi apa yang terjadi ketika proyeknya bertumbuh? Bagaimana kalau Anda punya puluhan endpoint, logika bisnis yang rumit, dan bermacam fitur yang saling terkait? Struktur bawaannya akan cepat terasa sesak dan berantakan.
Di sinilah memikirkan arsitektur folder yang scalable sejak awal jadi penting. Artikel ini akan memandu Anda ke pendekatan yang sudah terbukti untuk menjaga proyek tetap bersih dan mudah dirawat: Module-Driven Structure.
Begitu Anda menambah fitur seperti Users, Products, Orders, dan Auth, struktur datar di folder src Anda akan jadi kacau:
src/
├── users.controller.ts
├── products.controller.ts
├── orders.controller.ts
├── auth.controller.ts
├── users.service.ts
├── products.service.ts
├── orders.service.ts
└── ... and so onMencari file yang berkaitan dengan satu fitur jadi merepotkan karena komponennya tersebar ke mana-mana. Ini tidak efisien dan menyiksa untuk dirawat.
Ide dasarnya adalah mengelompokkan semua file yang berkaitan dengan satu fitur ke dalam module-nya sendiri. Tapi kita bisa melangkah satu tahap lagi demi kejelasan maksimal, yaitu dengan membuat direktori modules khusus.
Pendekatan ini memisahkan dengan rapi antara logika bisnis inti aplikasi Anda dan kode pendukungnya (seperti konfigurasi dan helper umum).
Berikut struktur yang sangat direkomendasikan:
src/
├── modules/ # All business logic and features live here
│ ├── auth/ # Everything about authentication & authorization
│ │ ├── strategies/
│ │ ├── guards/
│ │ ├── dto/
│ │ ├── auth.controller.ts
│ │ ├── auth.module.ts
│ │ └── auth.service.ts
│ │
│ ├── products/ # "Products" feature module
│ │ ├── dto/
│ │ ├── entities/
│ │ ├── products.controller.ts
│ │ ├── products.module.ts
│ │ └── products.service.ts
│ │
│ └── users/ # "Users" feature module
│ ├── dto/
│ ├── entities/
│ ├── users.controller.ts
│ ├── users.module.ts
│ └── users.service.ts
│
├── common/ # Reusable components (pipes, filters, etc.)
│
├── config/ # Configuration management
│
├── database/ # Migrations, seeds, etc.
│
├── app.module.ts # Root module, where all feature modules are imported
└── main.ts # Application entry pointMari kita lihat peran masing-masing direktori di level teratas:
Ini jantung aplikasi Anda. Tiap sub-direktori mewakili satu fitur atau domain bisnis yang berdiri sendiri.
Folder ini adalah "kotak perkakas" proyek Anda. Semua komponen, fungsi, atau kelas yang bisa dipakai ulang di beberapa fitur ditaruh di sini. Contohnya decorator kustom untuk mengambil data user dari sebuah request, atau exception filter untuk menangani error secara konsisten di seluruh aplikasi.
Jangan pernah menulis kredensial database atau API key langsung di dalam kode. NestJS punya module @nestjs/config yang sangat baik untuk mengelola environment variable. Folder inilah tempat semua logika konfigurasi itu tinggal.
Kalau proyek Anda memakai migrasi atau seeding database, folder ini tempat yang pas untuk menyimpannya secara rapi dan terpisah dari logika aplikasi.
Menerapkan struktur folder yang kokoh sejak awal adalah investasi jangka panjang bagi kesehatan proyek Anda. Dengan mengelompokkan fitur-fitur di dalam direktori modules khusus, Anda mendapat arsitektur yang bersih, scalable, dan sangat mudah dirawat seiring aplikasinya bertumbuh.
Mulai rapikan kode Anda dengan cara ini, dan Anda di masa depan akan berterima kasih! Selamat ngoding!