โครงสร้างโปรเจ็คแบบ 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
Service คือออบเจกต์ที่เป็นส่วนของ Business Logic
เป็นตัวกำหนดวิธีการที่ดึงและประมวลข้อมูล การตรวจสอบข้อมูล (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