Skip to main content

Command Palette

Search for a command to run...

NestJS Scoping Lifecycle

Updated
View as Markdown
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 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