[Spring Boot] การวางโครงสร้าง Project

โครงสร้างโปรเจ็คแบบ MVC+S

โครงสร้างโปรเจคและการวาง package จะไม่ตายตัวขึ้นอยู่กับการใช้งานแต่ส่วนใหญ่ที่ใช้กันจะเป็นแบ่งหลักๆ ตาม concept ของ MVC+S ได้ดังภาพ

  • package Controller เก็บ class Controller (@Controller) สำหรับส่วนที่ทำหน้าที่เป็นสมองส่วนกลาง ประสานข้อมูลระหว่าง Model Service และ View คือ รับ input มาจาก user แล้วก็ตัดสินใจ หรือ ประมวลผลว่า จะทำอะไรยังไงต่อ จากนั้นส่งค่า output กลับไปให้ user
  • package Entity หรือ Model เก็บ class โครงสร้างข้อมูลตาม schema (@Entity) คือ ส่วนที่ทำหน้าที่เป็นรูปร่างลักษณะข้อมูลของเราว่าจะมีหน้าตาเป็นยังไงมีฟิลด์อะไรบ้าง
  • package Repository เก็บ class Repository (@Repository) คือ ส่วนที่เชื่อมต่อ Database ให้เรา จะมี method query ต่างๆอยู่ในนี้เลย พวก findAll findBy โน่นนี่ จะมาอยู่ในนี่หมดเลย
  • package Service เก็บ class Service (@Service) ส่วนที่ทำหน้าที่จัดการ Business Logic ทั้งหมดไว้เลย สังเกตว่า ใน Controller เรามันไม่ได้ทำอะไรเลยอ่ะ รับ input มาละก็เรียก service เลย อะไรแบบนั้น เพราะทุกอย่างมันมากองอยู่ตรงนี้ละแหล่ะ

Controller

Controller คือออบเจกต์ที่ทำหน้าที่รับคำสั่ง เช่น คำสั่งค้นหา, คำสั่งลบข้อมูล เป็นต้น เมื่อมีคำสั่ง (หรือ Request) เข้ามาจากผู้ใช้ (User) ออบเจกต์ตัวนี้จะทำหน้าที่รับคำสั่งและเรียกใช้ออบเจกต์ตัวอื่นๆ ให้ทำงานร่วมกัน

Service

เป็นตัวกำหนดวิธีการที่ดึงและประมวลข้อมูล การตรวจสอบข้อมูล (Validation) อัพเดทข้อมูลอัติโนมัติ เช่น เปลี่ยนค่าใน dateOfBirth จะต้องมีการเปลี่ยนค่าของ age ด้วย ซึ่งไม่เกี่ยวกับการแสดงผลข้อมูล และการจัดเก็บข้อมูล

  • โค๊ดส่วนของ Business Logic นั้นจะถูกเขียนเพื่อให้ไม่เกิดการยึดติดกับโค๊ดส่วนอื่น ๆ
  • จะมีเมธอดต่างๆเพื่อรองรับการประมวลผล เช่น มีเมธอด checkPreOrderStatus() เพื่อตรวจสอบข้อมูลการสั่งสินค้า
  • โลจิกที่อยู่ในเมธอดต่างๆก็คือ Business Logic
  • เรียก Service Object นี้ว่า Business Object ก็ได้

( DAO = Repository)

Controller ทำหน้าที่รับคำสั่งจากผู้ใช้, ทำการตรวจสอบข้อมูลก่อนการประมวลผล, เรียกออบเจกต์ Service เพื่อทำการประมวลผลจริง, และส่งต่อผลลัพธ์ที่ได้ไปแสดงผล

Service ทำหน้าที่ประมวลผลและเข้าถึงระบบจัดเก็บข้อมูล (Business Logic + Data Access Logic)

*** กรณีข้อมูลไม่ซับซ้อนมาก หรือต้องการความฉับไว สามารถรวม Service เข้ากับ Controller ได้

Reference:

https://medium.com/@suchanya.roekplain/spring-boot-a35ba5f81a30