Membangun REST API Production-Ready dengan Next.js 15 App Router
Panduan arsitektur endpoint, validasi Zod, error handling terstandar, dan koneksi Prisma ORM di Next.js 15 App Router.
Pengantar
Membangun REST API di Next.js 15 App Router memerlukan pola arsitektur yang terstruktur agar maintainable, tahan skala besar, dan aman. Melalui rilis Next.js 15 dengan React 19, arsitektur Route Handler (route.ts) menjadi semakin tangguh untuk menangani request backend berlatensi rendah.
Arsitektur Directory
Gunakan pemisahan layer yang jelas antara routing handler, controller bisnis, dan akses database:
src/
├── app/
│ └── api/
│ └── v1/
│ └── orders/
│ └── route.ts
├── server/
│ ├── services/
│ │ └── orderService.ts
│ └── validations/
│ └── orderSchema.ts
└── lib/
└── db.ts1. Validasi Input Menggunakan Zod
Jangan pernah mempercayai data dari payload HTTP. Lakukan validasi skema sebelum menyentuh database:
import { z } from 'zod';
export const createOrderSchema = z.object({
customerId: z.string().cuid(),
items: z.array(z.object({
productId: z.string(),
quantity: z.number().int().positive(),
price: z.number().positive(),
})).min(1, 'Pesanan minimal berisi 1 item'),
notes: z.string().max(255).optional(),
});2. Implementasi Route Handler
Berikut adalah pola standar penanganan respon dengan status code yang tepat:
import { NextRequest, NextResponse } from 'next/server';
import { createOrderSchema } from '@/server/validations/orderSchema';
import { db } from '@/lib/db';
export async function POST(req: NextRequest) {
try {
const json = await req.json();
const validated = createOrderSchema.safeParse(json);
__MD_HL_18__ (!validated.success) {
return NextResponse.json(
{ success: false, errors: validated.error.flatten() },
{ status: 422 }
);
}
const order = await db.order.create({
data: validated.data,
});
return NextResponse.json(
{ success: true, data: order },
{ status: 201 }
);
} __MD_HL_25__ (error) {
console.error('[ORDER_CREATE_ERROR]', error);
return NextResponse.json(
{ success: false, message: 'Internal Server Error' },
{ status: 500 }
);
}
}3. Best Practice Keamanan & Performa
- Connection Pooling: Pastikan Prisma Client menggunakan connection pooler seperti PgBouncer atau Supabase Pooler pada port 6543.
- Rate Limiting: Gunakan library
@upstash/ratelimituntuk mencegah serangan brute force atau scraping agresif. - CORS Configuration: Tetapkan header CORS spesifik hanya untuk domain yang diizinkan.
Siap mendalami topik lainnya?
Koleksi tutorial arsitektur, clean code, dan DevOps kami diperbarui secara berkala.

