PlusMagi's Blog By Pitt Phunsanit Backend,Database TypeScript: การเข้าถึงเอลิเมนต์โดยใช้คลาส

TypeScript: การเข้าถึงเอลิเมนต์โดยใช้คลาส

ในโลกของการพัฒนาซอฟต์แวร์ระดับองค์กร (Enterprise) การจัดการข้อมูลที่มาจากฐานข้อมูลเชิงสัมพันธ์ (RDBMS) อย่าง PostgreSQL นั้น จำเป็นต้องอาศัยความแม่นยำและความปลอดภัยของข้อมูลเป็นหลัก การใช้ภาษา TypeScript เข้ามาช่วยในการกำหนดโครงสร้างข้อมูล (Schema) และการสร้างชั้นการเข้าถึงข้อมูล (Data Access Layer) ด้วย Class Pattern จึงเป็นแนวทางที่ช่วยยกระดับความมั่นคงของโค้ดได้อย่างมาก

บทความนี้จะเจาะลึกว่าเราสามารถใช้คุณสมบัติของ TypeScript Class เพื่อสร้างตัวกลางในการสื่อสารกับ PostgreSQL อย่างไร ทำให้มั่นใจได้ว่าทุกการเรียกใช้ข้อมูลเป็นไปตามโครงสร้างที่กำหนด (Type Safety) และง่ายต่อการบำรุงรักษาในระยะยาว

TypeScript Class: การสร้าง Repository Pattern สำหรับ PostgreSQL

ในมุมมองของสถาปัตยกรรมซอฟต์แวร์ (Software Architecture) การใช้ Class เพื่อสร้าง ‘Repository’ หรือ ‘DAO (Data Access Object)’ เป็นการแยกความรับผิดชอบ (Separation of Concerns) ออกจากส่วนตรรกะทางธุรกิจ (Business Logic) Class นี้จะทำหน้าที่เป็นตัวควบคุมการเข้าถึงฐานข้อมูลทั้งหมด ทำให้โค้ดของเรามีความสะอาดและสามารถทดสอบได้ง่าย

หลักการทำงาน: การห่อหุ้มการเชื่อมต่อ (Encapsulation)

เมื่อเราใช้ Class ใน TypeScript เพื่อจัดการ PostgreSQL, Class นั้นจะห่อหุ้ม (Encapsulate) การเชื่อมต่อฐานข้อมูล (Connection Pool) และเมธอดที่ใช้ในการรันคำสั่ง SQL ทั้งหมด ตัวอย่างเช่น แทนที่จะให้ Business Logic เรียกใช้ `client.query(…)` โดยตรง เราจะสร้างเมธอดอย่าง `UserRepository.findById(id)` ซึ่งภายในเมธอดนี้เองที่จัดการการเชื่อมต่อและการประมวลผลผลลัพธ์ให้เป็น Object ที่มี Type กำหนดไว้แล้ว

TypeScript

// 1. กำหนด Interface เพื่อความปลอดภัยของ Type (Data Contract) 
interface User {
    id: number;
    name: string;
    email: string;
}

// 2. สร้าง Class สำหรับจัดการการเข้าถึงข้อมูล (Repository)
class UserRepository {
    private connection: any; // สมมติว่ามีการจัดการ connection pool

    constructor(connection: any) {
        this.connection = connection;
    }

    /**
     * ดึงข้อมูลผู้ใช้ตาม ID โดยใช้ PostgreSQL
     */
    public async findById(userId: number): Promise<User | null> {
        const query = 'SELECT id, name, email FROM users WHERE id = $1';
        const values = [userId];
        
        // การรันคำสั่ง SQL ผ่าน PostgreSQL
        const result = await this.connection.query(query, values);
        
        // ตรวจสอบและแปลงผลลัพธ์ให้เป็น Type ที่กำหนด
        if (result.rows.length > 0) {
            const row = result.rows[0];
            return { 
                id: row.id, 
                name: row.name, 
                email: row.email 
            } as User;
        }
        return null;
    }
}

// การใช้งาน: 
// const userRepo = new UserRepository(pgClient);
// const user = await userRepo.findById(1);

ข้อดีของการใช้ Class Pattern กับ PostgreSQL

  • Type Safety: TypeScript บังคับให้เรากำหนดโครงสร้างข้อมูลที่ส่งกลับมา (เช่น `User` interface) ทำให้ลดข้อผิดพลาดที่เกิดจากการเข้าถึงข้อมูลผิดประเภท (Runtime Errors)
  • Maintainability: การรวมโค้ด SQL และการจัดการผลลัพธ์ไว้ใน Class เดียว ทำให้การแก้ไขหรือปรับปรุง Query ในอนาคตทำได้ง่าย
  • Reusability: Class นี้สามารถถูกเรียกใช้จากส่วนต่างๆ ของแอปพลิเคชันได้โดยไม่ต้องเขียนโค้ดการเชื่อมต่อฐานข้อมูลซ้ำ

บทสรุป

การผสานรวมพลังของ TypeScript Class เข้ากับความสามารถของ PostgreSQL ไม่เพียงแต่ช่วยให้เราสามารถเข้าถึงข้อมูลได้อย่างมีประสิทธิภาพเท่านั้น แต่ยังช่วยสร้างชั้นความปลอดภัยทางประเภทข้อมูล (Type Safety Layer) ให้กับระบบทั้งหมด ทำให้โค้ดของเรามีความเป็นสถาปัตยกรรมที่แข็งแกร่ง (Robust Architecture) เหมาะสำหรับการพัฒนาแอปพลิเคชันระดับองค์กรที่ต้องการความมั่นคงสูงสุด