Backend API — INSERT INTO Table

File & kode yang harus ditulis programmer untuk 1 endpoint insert

Skenario Pengujian

Diagram ini membandingkan berapa banyak file dan baris kode yang harus ditulis secara manual oleh programmer untuk membuat 1 endpoint POST (insert data) ke tabel contact di 6 framework backend yang berbeda.

Tujuannya adalah memvisualisasikan boilerplate overhead — seberapa banyak kode repetitif (model, repository, service, controller, DTO, validasi, routing) yang harus dibuat untuk operasi CRUD paling dasar. Semakin banyak kotak dalam diagram, semakin banyak file yang harus ditulis dan di-maintain oleh programmer.

Setiap tab menunjukkan arsitektur khas framework tersebut: mulai dari Spring Boot (4 file), NestJS (5 file), Node.js Express (2 file), Laravel (3 file), Python FastAPI (3 file), hingga RESTForge yang menghasilkan 9 endpoint lengkap dari 1 file konfigurasi JSON tanpa menulis kode sama sekali.

● klik setiap kotak untuk lihat contoh kode

table: contact  |  PK: contact_id VARCHAR(70) UUID  |  required: contact_name  |  audit: created_at, created_by, updated_at, updated_by
1
EntityContact.java
Mapping tabel contact ke Java class. PK bertipe String karena contact_id adalah UUID::VARCHAR(70).
@Entity@Table(name=…)@Id@Column
2
RepositoryContactRepository.java
Interface yang extend JpaRepository<Contact, String>. Method .save() sudah tersedia otomatis.
@RepositoryJpaRepository<Contact, String>.save()
3
ServiceContactService.java
Generate UUID, set audit fields, lalu panggil repository.save() untuk INSERT.
@Service@AutowiredUUID.randomUUID()
4
ControllerContactController.java
Endpoint POST /api/contacts — menerima JSON body dan mengembalikan data contact yang tersimpan.
@RestController@PostMapping@RequestBodyResponseEntity
Summary — Spring Boot
4
File
1
Endpoint
~30m
Estimasi
Keunggulan
  • Ekosistem enterprise terbesar dan paling mature
  • Type-safe — error terdeteksi saat compile
  • Separation of concerns ketat (4 layer)
  • Dependency injection bawaan
Kelemahan
  • Boilerplate paling banyak untuk 1 endpoint
  • Learning curve tinggi (annotation, JPA, DI)
  • Verbose — getter/setter untuk setiap field
Cocok Untuk
Enterprise application, sistem berskala besar dengan tim 10+ developer, project yang membutuhkan stabilitas (stability) jangka panjang.
📄 application.properties — konfigurasi koneksi PostgreSQL (sekali saja): spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
1
Entitycontact.entity.ts
TypeORM entity untuk tabel contact. Pakai @PrimaryColumn + @BeforeInsert karena UUID di-generate aplikasi.
@Entity('contact')@PrimaryColumn@BeforeInsert
2
DTOcreate-contact.dto.ts
Validasi request body. Hanya field dari user — contact_id dan audit fields di-generate otomatis di service.
@IsString()@IsEmail()@IsOptional()@MaxLength()
3
Servicecontacts.service.ts
Set UUID, is_active, created_at, created_by, updated_at, updated_by — lalu this.repo.save().
@Injectable()@InjectRepositoryuuidv4().save()
4
Controllercontacts.controller.ts
Endpoint POST /api/contacts — memanggil service.create() dan mengembalikan Contact yang baru dibuat.
@Controller('contacts')@Post()@Body()
5
Modulecontacts.module.ts
Mendaftarkan entity, controller, dan service. Wajib ada di NestJS agar komponen saling dikenali.
@Module()TypeOrmModule.forFeature
Summary — NestJS
5
File
1
Endpoint
~30m
Estimasi
Keunggulan
  • Arsitektur modular — mirip Angular, terstruktur rapi
  • TypeScript native — type-safe dan autocomplete
  • Validasi bawaan via class-validator (DTO)
  • Dependency injection otomatis
Kelemahan
  • File terbanyak (5 file) untuk 1 endpoint
  • Overhead module system wajib di setiap fitur
  • Learning curve decorator + DI pattern
Cocok Untuk
Tim yang sudah familiar dengan Angular atau Spring Boot, project menengah-besar yang butuh struktur ketat dengan TypeScript.
📄 app.module.ts — konfigurasi TypeORM ke PostgreSQL + import ContactsModule  |  📄 main.tsapp.setGlobalPrefix('api')
1
Model / QuerycontactModel.js
Raw SQL INSERT INTO contact dengan parameterized query. UUID di-generate pakai library uuid.
pguuidINSERT INTO contactRETURNING *
2
ControllercontactController.js
Validasi contact_name, ambil createdBy dari header, panggil model, return JSON 201.
req.bodyreq.headersres.status(201)try/catch
3
RoutecontactRoutes.js
Daftarkan endpoint POST dan hubungkan ke controller. Di app.js, mount dengan app.use().
express.Router()router.post('/')
Summary — Node.js Express
3
File
1
Endpoint
~15m
Estimasi
Keunggulan
  • Minimalis — tanpa abstraksi berlebihan
  • Kontrol penuh atas SQL query
  • Fleksibel — bebas menentukan struktur project
  • Ekosistem npm terbesar di dunia
Kelemahan
  • Raw SQL — rentan typo, tidak ada type checking
  • Tanpa validasi bawaan, harus tulis manual
  • Tanpa struktur standar — tiap developer bisa berbeda
Cocok Untuk
Prototype cepat, microservice ringan, developer yang ingin kontrol penuh tanpa "magic" dari framework.
📄 db.js — Pool ke PostgreSQL  |  📄 app.jsapp.use('/api/contacts', contactRoutes)
1
ModelContact.php
Eloquent model dengan konfigurasi khusus UUID PK: $incrementing=false, $keyType=string, $timestamps=false.
$table='contact'$primaryKey$incrementing=false$fillable
2
ControllerContactController.php
Method store() — validasi, generate UUID via Str::uuid(), set audit fields, lalu Contact::create().
store(Request)Str::uuid()Contact::create()
3
Route APIroutes/api.php
Satu baris mendaftarkan endpoint. Semua route di file ini otomatis mendapat prefix /api.
Route::post('/contacts')Route::apiResource
Summary — Laravel
3
File
1
Endpoint
~15m
Estimasi
Keunggulan
  • Eloquent ORM — syntax paling ekspresif dan elegan
  • Validasi built-in langsung di controller
  • Artisan CLI untuk scaffold (make:model -mcr)
  • Dokumentasi dan komunitas sangat lengkap
Kelemahan
  • PHP ecosystem lebih kecil untuk API-only project
  • Konvensi ketat — harus ikuti "Laravel way"
  • Performance lebih rendah dibanding Go/Rust/Node
Cocok Untuk
Full-stack web application, rapid development, tim yang familiar dengan PHP dan ingin konvensi standar.
📄 .env — DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD
1
Schema (Pydantic)schemas/contact.py
Validasi request body. contact_id dan audit fields tidak ada di sini — di-generate di router.
BaseModelOptional[str]EmailStrField()
2
Model (SQLAlchemy)models/contact.py
Mapping tabel contact ke Python class. PK String(70), field opsional nullable=True.
__tablename__='contact'String(70)BooleanDateTime
3
Router (Endpoint)routers/contact.py
Endpoint + logika dalam satu tempat. uuid4() untuk PK, datetime.now() untuk audit, db.add() untuk INSERT.
@router.postuuid4()db.add()db.commit()
Summary — Python FastAPI
3
File
1
Endpoint
~15m
Estimasi
Keunggulan
  • Auto-generate Swagger/OpenAPI docs di /docs
  • Type hints — validasi otomatis via Pydantic
  • Async native — performa tinggi untuk I/O
  • Syntax Python yang bersih dan mudah dibaca
Kelemahan
  • Ekosistem web lebih muda dibanding Django/Flask
  • SQLAlchemy setup cukup verbose
  • Belum banyak konvensi standar untuk project besar
Cocok Untuk
API-first project, data science backend, microservice yang butuh dokumentasi otomatis dan performa tinggi.
📄 database.py — engine & session SQLAlchemy  |  📄 main.pyapp.include_router(contact.router)
1
Payload JSONpayload/contact.json
Satu file JSON mendefinisikan tabel, field, validasi, dan action. Ini satu-satunya file yang ditulis developer.
tableNameprimaryKeyfieldNameactionfieldValidation
2
Generate (CLI)terminal
Satu perintah CLI men-generate seluruh kode: model, module, metadata, dan demo scripts.
restforge-cli create--project--endpoint--payload
3
Output (Auto-generated)src/
RESTForge men-generate model, module, metadata, dan demo scripts. Tidak perlu menulis kode manual.
ModelModuleMetadataDemo Scripts
Summary — RESTForge
1
File
9
Endpoint
<2m
Estimasi
Keunggulan
  • 1 payload menghasilkan 9+ endpoint sekaligus
  • RESTForge Studio — visual UI, tanpa tulis kode/JSON
  • Schema introspection — field otomatis dari database
  • Composite CRUD — master-detail dalam 1 transaksi
  • Component Engine + Processor untuk custom logic
  • Built-in: aggregation, export/import, caching
  • Distributed lock, rate limiting, job scheduler
  • Multi-database: PostgreSQL, MySQL, Oracle
Kelemahan
  • Ekosistem dan komunitas masih baru
  • Dokumentasi dan tutorial masih dalam pengembangan
Cocok Untuk
Data-driven applications (ERP, inventory, admin panel), sistem dengan transaksi master-detail, project yang butuh API lengkap dengan caching dan job scheduler.
📄 config/db-postgres.env — koneksi database, port server, logging