Episode ini membahas integrasi database di NestJS: memilih TypeORM, Sequelize, atau Prisma; mendefinisikan entity dan migrations; memakai repository pattern dan query builder; serta database in-memory untuk development dan testing.

Aplikasi nyata hampir selalu butuh menyimpan data. NestJS menyediakan integrasi resmi untuk berbagai ORM, dan episode ini akan memandu kalian memilih serta memakainya. Kita akan fokus pada TypeORM karena paling umum, lalu menyentuh Prisma dan Sequelize.
Dengan penguasaan data access, kalian bisa membangun aplikasi yang benar-benar berguna — bukan sekadar endpoint yang mengembalikan data statis.
Ketiga ORM ini adalah pilihan utama di ekosistem NestJS:
Untuk series ini kita memakai TypeORM karena integrasinya paling mulus dengan dekorator NestJS.
npm install @nestjs/typeorm typeorm sqlite3Untuk PostgreSQL, ganti sqlite3 dengan pg. Package @nestjs/typeorm adalah wrapper resmi yang mengintegrasikan TypeORM ke NestJS.
Tambahkan konfigurasi di root module:
import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
@Module({
imports: [
TypeOrmModule.forRoot({
type: "sqlite",
database: "data.sqlite",
autoLoadEntities: true,
synchronize: true,
}),
],
})
export class AppModule {}autoLoadEntities: true otomatis mendaftarkan entity dari module fitur, dan synchronize: true menyinkronkan skema dengan database — cukup untuk development, jangan dipakai di production.
Entity adalah class yang merepresentasikan tabel:
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
@Entity("users")
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column({ unique: true })
email: string;
}Dekorator @Entity("users") memetakan class ke tabel users, @PrimaryGeneratedColumn untuk primary key auto-increment, dan @Column untuk kolom.
synchronize hanya untuk development. Untuk production, gunakan migrations yang menghasilkan skema secara terkontrol:
npm run typeorm -- migration:generate src/migrations/Init --dataSource src/data-source.tsMigrations menyimpan riwayat perubahan skema sehingga bisa diterapkan ke semua environment secara konsisten dan bisa di-rollback.
TypeORM menyediakan repository pattern lewat @InjectRepository:
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { User } from "./user.entity";
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private readonly usersRepository: Repository<User>,
) {}
create(name: string, email: string): Promise<User> {
const user = this.usersRepository.create({ name, email });
return this.usersRepository.save(user);
}
findAll(): Promise<User[]> {
return this.usersRepository.find();
}
}Repository menyediakan method siap pakai: find, findOne, save, update, delete, dan banyak lagi. Agar repository bisa di-inject, daftarkan entity lewat TypeOrmModule.forFeature([User]) di array imports module fitur.
Untuk query kompleks, TypeORM menyediakan query builder:
async findActiveByName(name: string): Promise<User[]> {
return this.usersRepository
.createQueryBuilder("user")
.where("user.name LIKE :name", { name: `%${name}%` })
.andWhere("user.isActive = :active", { active: true })
.orderBy("user.id", "DESC")
.take(10)
.getMany();
}Query builder memberi kontrol penuh atas SQL yang dihasilkan: join, subquery, aggregasi, dan pagination. Parameter :name mencegah SQL injection karena memakai parameter binding.
Untuk testing, database in-memory sangat praktis karena tidak menyentuh disk:
TypeOrmModule.forRoot({
type: "sqlite",
database: ":memory:",
autoLoadEntities: true,
synchronize: true,
})Nilai ":memory:" membuat database berjalan di RAM dan hilang saat proses selesai — sempurna untuk unit test yang cepat dan terisolasi.
Episode 6 membawa kalian dari nol sampai data benar-benar tersimpan: memilih ORM, konfigurasi TypeORM, definisi entity, migrations, repository pattern, query builder, dan database in-memory.
Inti yang harus dibawa pulang:
TypeOrmModule.forRoot mengonfigurasi koneksi database.synchronize hanya untuk development; production pakai migrations.@InjectRepository.Di episode 7 selanjutnya kita akan membahas validation dan exception handling — validasi dengan class-validator dan class-transformer, global pipes, custom validation pipes, exception filters, serta standardisasi error response.