spring-boot-00
เนื่องจากต้องทำการแนะนำและวางโครงสร้างระบบงานที่พัฒนาด้วยภาษา Java
โดยสิ่งที่ต้องการคือ ระบบ REST APIs ง่าย ๆ
ซึ่งทางเลือกในภาษา Java ก็มีมากมายทั้ง

  • Servlet 3
  • JAX-RS
  • Jersey
  • Spring MVC
  • Spring Boot
  • Drop Wizard

คำถามแรกคือ จะเลือกอะไรดีล่ะ ?
คำตอบคือ
ความต้องการของระบบเป็นอย่างไร ?
ความสามารถของทีมเป็นอย่างไร ?

ตอบด้วยคำถาม นี่มันกวนจริง ๆ นะ !!

ถ้าทีมมีความรู้และความเชี่ยวชาญไม่มาก
แนะนำว่าแค่ Servlet 3 + JSON + JDBC ก็พอแล้ว
มันเหลือเฟือมาก ๆ

แต่ในระบบนี้ผมเลือกที่จะเสนอและแนะนำ Spring Boot

เนื่องจากช่วยทำให้เราเริ่มต้นพัฒนาระบบได้ง่าย (ถ้ามีความเข้าใจมันนะ)
เนื่องจากเตรียมชุดของ library ที่จำเป็นไว้ให้แล้ว
เนื่องจากถูกออกแบบมาให้สร้าง REST APIs ได้ง่าย
ที่สำคัญ start service ได้ง่าย ๆ อีกด้วย
มี Embedded Webserver ให้ด้วยนั่นก็คือ Tomcat/Jetty
มี feature ที่สำคัญอีกคือ Metric และ Healthcheck ของ service
มี embedded database ไว้ให้ทดสอบคือ H2 database
เข้ากับแนวคิด Microservice มากเลย

แต่ปัญหาเดิม ๆ ของ Spring framework ก็คือ
Library ต่าง ๆ เยอะ ดังนั้นในการเริ่มต้นก็ต้อง download library ผ่าน Apache Maven
ซึ่งใช้เวลานานพอสมควร
ขนาดของไฟล์ JAR/WAR มีขนาดใหญ่ เนื่องจากมี library เยอะนั่นเอง
แค่เริ่มต้นระบบก็มีขนาดไป ประมาณ 50 MB แล้วนะ (REST + JDBC + ลืมเอา hibernate ออก)
ส่วนความซับซ้อนของตัว Spring framework เอง ไม่ต้องพูดถึง
ดังนั้นนั้น ก่อนใช้งานต้องเข้าใจมันให้ดีก่อนนะ
เพื่อให้เราสามารถจัดการกับความซับซ้อนเหล่านั้นได้

มาเริ่มต้นวางโครงสร้างระบบกันดีกว่า

เริ่มจากการแบ่งระบบเป็น module ย่อย ๆ ดังนี้

  • REST สำหรับ code ของ controller สำหรับกำหนด service ต่าง ๆ เพื่อรับ request และ ส่ง response กลับไป
  • Model สำหรับจัดการข้อมูลจากระบบต่าง ๆ ทั้ง database, external service

โดยในแต่ละ module ต้องมีชุดการทดสอบด้วยเสมอ
แน่นอนว่า Spring framework ตอบโจทย์ทั้งหมด ดังนี้

  • สำหรับ REST จะมี MockMvc เอาไว้ทดสอบ
  • สำหรับ Model นั้นใช้งาน JDBC ซึ่งมี Embedded database คือ H2 database ให้ใช้งาน แต่ในระบบตัวอย่างผมใช้ MariaDB ไปเลย

ในการทดสอบของ Spring framework จะทำงานผ่าน SpringJUnit4ClassRunner
ซึ่งเป็นการทดสอบในระดับ integration/system test
อาจจะใช้เวลามากขึ้นมาหน่อย
แต่สิ่งที่ได้รับกลับมาถือว่าคุ้มมาก ๆ

ส่วนการตั้งชื่อ package นั้น
จะทำการแยกด้วยชื่อ feature
ส่วนภายใน package จะประกอบไปด้วย package ย่อย ๆ อะไรก็ตามใจ
ข้อดีคือ ทำให้เราเห็น code ทั้งหมดของ feature นั้น ๆ
โดยไม่ต้องกระโดดข้าม package ไปมา

ตัวอย่างของ Model เป็นดังรูป

spring-boot-01

ความต้องการหลักคือ ชุดการทดสอบ
ระบบนี้จะทำการเชื่อมต่อไปยัง database ตรง ๆ ผ่าน JDBC กันเลย
ที่สำคัญ Spring framework นั้น
จะทำการสร้าง table และข้อมูลขึ้นมาให้ทุกครั้งก่อนการทดสอบ
เพียงทำการสร้างไฟล์ใน resoources คือ

  • schema.sql สำหรับสร้าง table
  • data.sql สำหรับสร้างชุดข้อมูลเริ่มต้น

ทำให้การเตรียมข้อมูลสำหรับการทดสอบง่ายขึ้นไปอีก
ส่วน configuration ของ database อยู่ในไฟล์ application.properties (เปลี่ยนชื่อก็ได้นะ)
ในตัวอย่างผมใช้ MariaDB นะ สร้างด้วย Docker ไปเลย
สามารถเขียน code ได้ดังนี้

ปล. @SpringApplicationConfiguration มัน deprecated ไปแล้วนะ !!

ต่อมาคือ REST module ซึ่งจัดโครงสร้างคล้าย ๆ กับ Model

แต่ไม่มี JDBC นะ !!
ในตัวอย่างจะใช้ Embedded Web Server คือ Apache Tomcat
สิ่งที่สนใจก็เช่นเดิมคือ การทดสอบนั่นเอง
โดยส่วนนี้จะทำการทดสอบด้วย MockMvc นะ
เป็น integration test กันทั้งสายของ feature นั้น ๆ เลย
ดังนั้นการเตรียมระบบและข้อมูลจึงมีความสำคัญมาก ๆ

สามารถเขียน code ได้ดังนี้

ชีวิตในการพัฒนาระบบด้วยภาษา Java ก็ยาวนิดหน่อย
แต่ก็ไม่ได้ยากหากมีความพยายามเพียงพอ

เพียงเท่านี้ก็สามารถตั้ง project structure ด้วย Spring Boot แบบง่าย ๆ ได้แล้วนะครับ

สิ่งที่ต้องคำนึงถึงเสมอคือ
ถ้าคุณตั้ง project structure ได้แล้ว
จะทดสอบระบบกันอย่างไร ?
จะติดตั้งกันอย่างไร ?
ต้องคิดถึงก่อนจะเริ่มเขียน code บรรทัดแรก
หรือก่อนเริ่ม feature แรกเลยนะครับ
จากนั้นจึงลงมือทำและพิสูจน์ให้ได้
ไม่ใช่มานั่งเทียนเขียน architecture ที่ดูสวยหรูกัน !!!

พูดได้ ก็ต้องทำให้เห็นเช่นกัน

สุดท้ายก็ run สิครับด้วยคำสั่ง mvn clean install

ขอให้โชคดีครับกับ Spring Boot
นี่คือหนึ่งแนวทางในการแก้ไขปัญหาครับ
หรือว่ามันคือการสร้างปัญหากันแน่ !!

ตัวอย่างของ code อยู่ที่ Github::Up1::Demo Spring Boot

ต่อจากนี้เราก็เอา Docker มาจัดการ Spring Boot ต่อไปนะครับ