ป้ายกำกับ: ตรวจจับความเคลื่อนไหว

Hexagonal Architecture (Ports and Adapters)Hexagonal Architecture (Ports and Adapters)

ในโลกของการพัฒนาซอฟต์แวร์ขนาดใหญ่ การออกแบบระบบที่ยืดหยุ่น (Decoupling) เป็นสิ่งสำคัญอย่างยิ่ง แนวคิด Hexagonal Architecture หรือที่รู้จักกันในชื่อ Ports and Adapters คือรูปแบบสถาปัตยกรรมที่ช่วยแยกส่วน Business Logic หลักออกจากรายละเอียดของโครงสร้างพื้นฐานภายนอก เช่น ฐานข้อมูล, UI, หรือบริการภายนอก

เมื่อนำหลักการนี้มาใช้กับ PostgreSQL ซึ่งเป็นระบบจัดการฐานข้อมูลที่ทรงพลัง เราจะมั่นใจได้ว่าแกนหลักของธุรกิจ (Domain Model) จะไม่ขึ้นอยู่กับภาษา SQL หรือการเปลี่ยนแปลงของ Schema โดยตรง แต่จะสื่อสารผ่าน ‘Ports’ (พอร์ต) ซึ่งเป็นอินเทอร์เฟซที่กำหนดไว้

→ Hexagonal Architecture: Ports และ Adapters ในบริบทของ PostgreSQL

หัวใจสำคัญของสถาปัตยกรรมนี้คือการสร้างขอบเขตที่ชัดเจน:

  • Domain Core (The Hexagon): คือ Business Logic หลักของเรา ซึ่งควรจะเป็นอิสระที่สุด
  • Ports: คืออินเทอร์เฟซที่ Domain Core ต้องการใช้ (เช่น ‘Port สำหรับการดึงข้อมูลสินค้า’)
  • Adapters: คือตัวนำไปใช้งานจริงที่เชื่อมต่อกับภายนอก (เช่น ‘PostgreSQL Adapter’ ที่ใช้ SQL เพื่อตอบสนอง Port นั้น)

ในทางปฏิบัติกับ PostgreSQL เราสามารถใช้ Stored Procedures หรือ Functions ในการทำหน้าที่เป็น ‘Adapter’ ที่รับคำสั่งจากชั้นบริการ (Service Layer) ซึ่งทำหน้าที่เป็นผู้เรียกใช้ ‘Port’ ได้อย่างมีประสิทธิภาพ

→ ตัวอย่างการใช้งาน PostgreSQL Adapter

สมมติว่าเรามี Domain Core ที่ต้องการดึงรายการ ID ของสินค้าที่ถูกระงับการขาย โดยไม่สนใจว่าข้อมูลจะถูกเก็บอย่างไร Adapter ของเราจึงทำหน้าที่นี้โดยใช้ฟังก์ชัน PostgreSQL ที่รับอินพุตเป็นรายการ ID ที่คั่นด้วยเครื่องหมายจุลภาค

SQL

-- 1. สร้างฟังก์ชัน Adapter (Adapter Layer) เพื่อจัดการกับรายการ ID
CREATE OR REPLACE FUNCTION get_suspended_products_adapter(input_ids text) RETURNS TABLE (product_id int, name text) AS $$
BEGIN
    RETURN QUERY
    SELECT p.id, p.name
    FROM products p
    WHERE p.id = ANY(string_to_array(input_ids, ',')) -- ใช้ string_to_array เพื่อรับรายการ ID
    AND p.is_active = FALSE;
END;$$
LANGUAGE plpgsql;

-- 2. การเรียกใช้ Adapter จาก Service Layer (จำลองการทำงานของ Port)
SELECT * FROM get_suspended_products_adapter('101,102,103');

ในตัวอย่างนี้, `get_suspended_products_adapter` คือ Adapter ที่รับผิดชอบการสื่อสารกับ PostgreSQL โดยตรง มันทำหน้าที่เป็นตัวตอบสนอง (Adapter) ต่อความต้องการของ Domain Core (Port) ที่ต้องการข้อมูลสินค้าที่ถูกระงับ

→ ข้อดีของการใช้ Hexagonal Architecture กับ PostgreSQL

การแยกส่วนนี้ทำให้ระบบของเราได้ประโยชน์หลายประการ:

  • Testability: เราสามารถทดสอบ Business Logic หลักได้โดยไม่ต้องเชื่อมต่อกับฐานข้อมูลจริง (Mocking the Adapter)
  • Maintainability: หากเราต้องการเปลี่ยนจาก PostgreSQL ไปใช้ NoSQL หรือเปลี่ยน Schema เราเพียงแค่เขียน Adapter ใหม่ โดยที่ Domain Core ไม่ต้องเปลี่ยนแปลง
  • Isolation: การเปลี่ยนแปลงของฐานข้อมูลจะไม่ส่งผลกระทบต่อแกนหลักของระบบ

→ บทสรุป

Hexagonal Architecture เป็นแนวคิดที่ช่วยยกระดับการออกแบบซอฟต์แวร์ให้มีความทนทานและยืดหยุ่นสูง การใช้ PostgreSQL ในฐานะ Adapter ที่แข็งแกร่ง ทำให้เราสามารถสร้างชั้นการเข้าถึงข้อมูลที่ชัดเจนและเป็นมาตรฐาน ส่งผลให้ระบบที่พัฒนาขึ้นมานั้นสามารถรองรับการเติบโตและการเปลี่ยนแปลงทางธุรกิจได้อย่างไร้รอยต่อ