ASDEV logo

ASDEV

Asdev Solution Technology

Semua Tutorial/Web Development
IntermediateWeb Development

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.

Ahmad Subadri (Lead Engineer)15 menit baca21 Oktober 202655 views
#Next.js#TypeScript#REST API#Prisma#Clean Architecture

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:

text
src/
├── app/
│   └── api/
│       └── v1/
│           └── orders/
│               └── route.ts
├── server/
│   ├── services/
│   │   └── orderService.ts
│   └── validations/
│       └── orderSchema.ts
└── lib/
    └── db.ts

1. Validasi Input Menggunakan Zod

Jangan pernah mempercayai data dari payload HTTP. Lakukan validasi skema sebelum menyentuh database:

typescript
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:

typescript
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/ratelimit untuk mencegah serangan brute force atau scraping agresif.
  • CORS Configuration: Tetapkan header CORS spesifik hanya untuk domain yang diizinkan.
text

Siap mendalami topik lainnya?

Koleksi tutorial arsitektur, clean code, dan DevOps kami diperbarui secara berkala.

Kembali ke Katalog Tutorial