Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

ตัวอย่างการวางโครงสร้างระบบด้วย Spring Boot

$
0
0

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 ได้ดังนี้ [gist id="b480580de49a4380aa76c08483f301b2" file="UserRepositoryTest.java"] ปล. @SpringApplicationConfiguration มัน deprecated ไปแล้วนะ !!

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

แต่ไม่มี JDBC นะ !! ในตัวอย่างจะใช้ Embedded Web Server คือ Apache Tomcat สิ่งที่สนใจก็เช่นเดิมคือ การทดสอบนั่นเอง โดยส่วนนี้จะทำการทดสอบด้วย MockMvc นะ เป็น integration test กันทั้งสายของ feature นั้น ๆ เลย ดังนั้นการเตรียมระบบและข้อมูลจึงมีความสำคัญมาก ๆ สามารถเขียน code ได้ดังนี้ [gist id="b480580de49a4380aa76c08483f301b2" file="FeatureControllerTest.java"] ชีวิตในการพัฒนาระบบด้วยภาษา 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 ต่อไปนะครับ

Viewing all articles
Browse latest Browse all 1997

Trending Articles