# NestJS Scoping Lifecycle

Untuk pengguna NestJS salah satu feature ini cukup berguna untuk dipahami, khususnya pengguna awal yang baru pindah sebagai contoh dari Express ke NestJS. Menurut kepercayaan saya, dengan memahami feature ini, programmer bisa lebih bijak dalam menggunakan memory. Lalu kenapa saya menggunakan istilah “berguna” dibanding “sangat perlu”. Sebab programmer masih bisa menggunakan alternative dengan merancang secara manual (merancang mandiri).

Module-module yang menggunakan decorator `Injectable` di NestJS secara default akan membuat [singleton](https://verri.andriawan.web.id/singleton-pattern) `instance`. Ketika pertama kali sebuah module provider di-*request* untuk di-*inject* ke constructor module, NestJS akan membuat satu `instance` dimana instance ini akan dibungkus oleh Module `InstanceWrapper` dan disimpan juga dibiarkan tetap ada di `Heap` selama lifecycle app juga masih dalam kondisi belum berakhir. Sehingga ketika ada module yang perlu menggunakannya lagi, NestJS tidak akan membuat instance baru, tapi memberikan instance yang sama, yang sebelumnya sudah dibuat (Singleton).

## **Injection Scope Type NestJS**

Pada NestJS terdapat tiga Scope Type yang bisa digunakan.

*   **DEFAULT** (Singleton)
    
    Setiap Module dengan Scope `DEFAULT`, akan dibuat menjadi instance ketika NestJS di inisialisasi atau ketika pertama kali NestJS App dijalankan bersamaan pada saat NestJS. menginisialisi `NestContainer`. Hanya saja ketika ada module lain yang memerlukan module ini, semua module yang diimport akan reference ke instance yang sama atau tanpa membuat instance baru (Singleton). Instance-instance ini akan tetep berada di heap selama NestJS tetap hidup.
    
*   **REQUEST**
    
    Pertama kali diinialisasi Nest App akan membuat instance `NestContainer`. Lalu Nest akan men-*scan* semua module-module yang terdaftar. Setiap module yang ter-*capture* akan di Wrapped oleh `InstanceWrapper`. Selanjutnya pada setiap kali request masuk ke presenter (ex: Controller) diterima oleh NestJS, NestJS akan mencari module mana yang memiliki Scope dengan tipe `Scope.REQUEST` . Jika ditemukan maka NestJS akan mengenerate Random number sebagai Context ID dan membuat Instance setiap module yang ditemukan. Selanjutnya `ContextID` yang sudah dibuat digunakan sebagai flag/key yang akan di push ke InstanceWrapper values bertipe `WeakMap` dengan value instance dari module tersebut. Jadi setiap kali ada module yang melakukan permintaan untuk meninject Module-module ini. Nest akan menginject dari instance yang sudah dibuat ketaik request masuk. Tidak membuat instance baru selama masih dalam satu lifecycle (request). Instance-instance ini tidak akan di heap selamanya. Garbage Collector akan menhapusnya ketika sudah tidak ada yang menggunakan instance tersebut.
    
*   **TRANSIENT**
    
    Module dengan jenis Scope TRANSIENT ini, sama seperti pada Scope `DEFAULT` . Akan dibuat menjadi instance ketika NestApp diinisialisasi setelah `NestContainer` dibuat. Hanya saja yang membedakannya adalah setiap kali module ini di-*inject* ke module lain yang membutuhkannya. NestJS akan membuat instance sendiri-sendiri untuk masing-masing module yang mengimportnya. Instance-instance ini akan tetap di heap selama app NestJS tetap hidup.
    

Scope Default dan Transient secara lifecycle terlihat mirip. Keduanya dibuat ketika Nest App menginisialisasi `NestContainer`. Keduanya juga tetap di **Heap** selama Nest App berjalan. Yang membedakan diantaranya yaitu Scope `DETAULT` hanya membuat satu instance untuk berapapun module yang meng-\*import-\*nya. Sedangkan untuk Scope `TRANSIENT` akan dibuat instance Singleton sendiri-sendiri untuk tiap module yang meng-\*import-\*nya.

Untuk Scope REQUEST, instance akan dibuat ketika request datang dan instance akan sementara berada di **Heap** (WeakMap Type). Selanjutnya Garbage Collector yang akan membersihkannya dari **Heap.**

Dari bagaimana cara NestJS menyimpan Instance-instance tersebut di memory, programmer akan lebih bisa bijak bagaimana merancang architecture dari program-nya.

## References

*   Github ([https://github.com/nestjs/nest](https://github.com/nestjs/nest))
    
*   NestJS ([https://docs.nestjs.com/fundamentals/injection-scopes](https://docs.nestjs.com/fundamentals/injection-scopes))
    
*   Singleton ([https://verri.andriawan.web.id/singleton-pattern](https://verri.andriawan.web.id/singleton-pattern))
