PlusMagi's Blog By Pitt Phunsanit Backend,Database PrimeReact Case Study: การทำ Form Validation ร่วมกับ React Hook Form และ Yup / Zod

PrimeReact Case Study: การทำ Form Validation ร่วมกับ React Hook Form และ Yup / Zod

ในโลกของการพัฒนาเว็บแอปพลิเคชันระดับองค์กร (Enterprise Applications) ฟอร์ม (Forms) ไม่ได้เป็นเพียงแค่ส่วนติดต่อผู้ใช้ (UI) เท่านั้น แต่เป็นจุดที่ข้อมูลสำคัญที่สุดถูกป้อนเข้ามา การรับประกันความสมบูรณ์และความถูกต้องของข้อมูล (Data Integrity) จึงเป็นโจทย์หลักที่นักพัฒนาสถาปัตยกรรมต้องแก้ไขอย่างรอบด้าน การสร้างระบบฟอร์มที่ทรงพลังจึงต้องอาศัยการทำงานร่วมกันระหว่างเครื่องมือ Frontend ที่ทันสมัย และ Backend ที่แข็งแกร่ง

บทความนี้จะเจาะลึกกรณีศึกษา (Case Study) ของการสร้างระบบฟอร์มที่ใช้ PrimeReact ในการแสดงผล, React Hook Form (RHF) ในการจัดการ State และ Zod/Yup ในการตรวจสอบข้อมูลระดับ Schema ซึ่งทั้งหมดนี้ต้องทำงานควบคู่ไปกับ PostgreSQL เพื่อให้มั่นใจว่าข้อมูลที่ถูกบันทึกนั้นผ่านการตรวจสอบความถูกต้องทั้งในระดับ Client-Side และ Server-Side อย่างสมบูรณ์

สถาปัตยกรรมแห่งความน่าเชื่อถือ: การแยกส่วนความรับผิดชอบ (Separation of Concerns)

หัวใจสำคัญของระบบฟอร์มที่แข็งแกร่งคือการแยกความรับผิดชอบอย่างชัดเจน React Hook Form ทำหน้าที่จัดการ Performance และการควบคุมการ Render ของฟอร์ม ส่วน Zod (หรือ Yup) จะรับหน้าที่เป็น Schema Validator ที่กำหนดกฎเกณฑ์ทางธุรกิจ (Business Rules) ทั้งหมด เช่น ฟิลด์นี้ต้องเป็นอีเมล, ฟิลด์นี้ต้องเป็นตัวเลข, หรือฟิลด์นี้ต้องไม่ว่างเปล่า

อย่างไรก็ตาม การพึ่งพาเพียงแค่ Client-Side Validation นั้นไม่เพียงพอ เพราะผู้ใช้งานสามารถข้ามการตรวจสอบของเบราว์เซอร์ได้เสมอ ดังนั้น PostgreSQL จึงเข้ามาเป็นด่านสุดท้าย (The Final Gatekeeper) โดยการใช้คุณสมบัติระดับฐานข้อมูล เช่น CHECK Constraints หรือการใช้ Stored Procedures เพื่อบังคับใช้กฎเกณฑ์ทางธุรกิจในระดับที่โครงสร้างข้อมูล (Schema) ไม่สามารถถูกละเมิดได้

การบังคับใช้ความถูกต้องในระดับ PostgreSQL

เมื่อข้อมูลถูกส่งมาจาก Frontend แล้ว Backend จะต้องทำการตรวจสอบซ้ำอีกครั้ง เพื่อป้องกันการแทรกข้อมูลที่ผิดรูปแบบหรือขัดแย้งกับกฎทางธุรกิจที่กำหนดไว้ในระดับฐานข้อมูล ตัวอย่างเช่น หากเราต้องการให้รหัสสินค้า (product_code) ต้องเป็นตัวอักษรภาษาอังกฤษเท่านั้น และต้องไม่ซ้ำกัน:

SQL

-- 1. สร้างตารางสินค้าพร้อมการจำกัดความถูกต้อง (Constraint)</code>
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    product_code VARCHAR(50) UNIQUE NOT NULL,
    stock_count INTEGER NOT NULL,
    price NUMERIC(10, 2) NOT NULL,
    -- ใช้ CHECK Constraint เพื่อจำกัดรูปแบบของรหัสสินค้า
    CONSTRAINT check_product_code_format CHECK (product_code ~ '^[A-Z0-9]+$')
); 

-- 2. ตัวอย่างการพยายามแทรกข้อมูลที่ผิดรูปแบบ (จะล้มเหลว)
INSERT INTO products (product_code, stock_count, price) VALUES ('PROD-XYZ', 10, 19.99);

-- 3. ตัวอย่างการแทรกข้อมูลที่ถูกต้อง (จะสำเร็จ)
INSERT INTO products (product_code, stock_count, price) VALUES ('ABC123', 50, 99.99);

การใช้ CHECK Constraint ใน PostgreSQL ทำให้มั่นใจได้ว่าแม้ว่าโค้ดส่วนใดส่วนหนึ่งจะพยายามแทรกข้อมูลที่ผิดรูปแบบ (เช่น มีเครื่องหมายขีดกลางที่ไม่ได้รับอนุญาต) ระบบจะปฏิเสธการทำธุรกรรมนั้นทันที ทำให้ระบบมีความทนทานและปลอดภัยในระดับสถาปัตยกรรมสูงสุด

บทสรุปสำหรับสถาปนิก (Architect Summary)

การออกแบบระบบฟอร์มที่สมบูรณ์แบบไม่ใช่แค่การใช้ React Hook Form เพื่อความสะดวกในการพัฒนา แต่คือการสร้างชั้นการป้องกันข้อมูล (Defense Layers) ที่หลายชั้น: Layer 1 (UI/UX) คือ PrimeReact และ RHF เพื่อประสบการณ์ผู้ใช้ที่ดี Layer 2 (Client Logic) คือ Zod/Yup เพื่อการตรวจสอบข้อมูลเบื้องต้น และ Layer 3 (Persistence/Security) คือ PostgreSQL ที่ใช้ CHECK Constraints และ Transaction Management เพื่อรับประกันว่าข้อมูลที่ถูกบันทึกนั้นเป็นไปตามกฎทางธุรกิจที่กำหนดไว้ 100% การบูรณาการทั้งสามส่วนนี้จึงเป็นหัวใจสำคัญของการสร้างแอปพลิเคชันระดับ Enterprise ที่เชื่อถือได้