สรุปคำแนะนำการพัฒนาระบบด้วย Spring Boot

ระหว่างนั่งกินข้าวกลางวัน มีคำถามเกี่ยวกับการพัฒนา Spring Boot ว่ามีคำแนะนำอะไรบ้าง ที่จำเป็นต่อการพัฒนา ก็เลยบอกไปสั้น ๆ ว่า เขียน code ให้ดี ทดสอบให้ได้ ที่เหลือก็รับผลกรรม !! ตอบแบบนี้ไปคงไม่ดีแน่ ๆ จึงสรุปไว้นิดหน่อย เน้นเฉพาะสิ่งที่ทำ อะไรที่มัน advance มาก ๆ ผมก็ทำไม่เป็น มาเริ่มกันเลย

เรื่องแรก ต้องเข้าใจก่อนว่า Spring Boot มันเหมือนขนมเค้กที่ทำเสร็จแล้ว

นั่นคือพร้อมกินหรือส่งมอบ ที่เหลืออยู่ที่ว่าเราต้องตกแต่ง หรือ ต่อเติมมันอย่างไร ดังนั้นต้องเข้าใจว่า มันมีโครงสร้างพื้นฐานการทำงานแบบที่ตกลงกันไว้อย่างไร มากกว่าที่จะมาทำการ custom หรือ configuration อะไร นั่นคือ Convention over Configuration นั่นเอง

เพราะว่าสิ่งที่เตรียมมาให้น่าจะดีในระดับหนึ่งแล้ว ที่สำคัญยิ่งไป custom เยอะ ยิ่งเลอะเทอะ แถมดูแลรักษายากอีก บ่อยครั้งไม่สามารถ upgrade ได้อีก ต้องระวังไว้เลย ข้อความระวังคือ พวก annotation ต่าง ๆ ที่จะเยอะเป็นพิเศษ ถ้าใครกำลังทำ หรือ เจออยู่ ขอให้ลด ละ เลิก เถอะ มันไม่ได้ดูเหนืออะไรนะ

เรื่องที่สอง การจัดการพวก dependency แนะนำให้ใช้ BOM (Bills of Material)

จะทำให้เราจัดการพวก dependency ของ project ได้ดียิ่งขึ้น หลัง ๆ มีปัญหาเกี่ยวกับเรื่องความปลอดภัยของ dependency ที่ใช้บ่อย ๆ

ยิ่งต้องใช้งาน

เรื่องที่สาม สร้าง project ด้วย Spring Initializr ดีกว่านะ

การไป copy จาก project ก่อนหน้า หรือ project เก่า ๆ ที่ทำมา และเชื่อว่ามันจะดี อย่าทำเลยนะ ขอร้อง

เรื่องที่สี่ โครงสร้างของ project ในเอกสารของ Spring Boot ก็บอกไว้

ทำเป็นในรูปแบบของ domain/function ซะ สำหรับ project ที่ใหญ่ แต่ Spring Boot ไม่ได้สร้างมาเพื่อให้ project ใหญ่นะ มี controller เยอะ ๆ ไม่น่าดีใช่ไหมนะ ? แต่ทำไมทำกันนะ สงสัยไม่อ่านเป้าหมายของ Spring Boot มั้ง !! แต่ถ้า project เล็ก ๆ เรื่องของ project structure ก็ไม่ได้สำคัญมากนัก อีกอย่างพวก Fat controller, large class/service คงไม่มีกันแล้วใช่ไหม ? ส่วน business logic จริง ๆ ไม่ควรหรือมี code ของ Spring Boot น้อยที่สุดใช่ไหม ? อีกอย่าง ถ้าสังเกตตัวอย่าง code ของ Spring Boot มักจะใช้ Constructor Injection หมดแล้วนะ ทำให้ไม่ต้องใช้ @AutoWired เลย นั่นหมายความว่า เราสามารถสร้าง instance โดยไม่ต้องอยู่ใน context ของ Springได้แบบง่าย ๆ อีกนะ พวก Controller, Service annotation ต่าง ๆ นั้น มันคือ singleton by default นะ ดังนั้นการจะเก็บ state ใด ๆ ก็ระวังให้มาก ๆ พอมีคนใช้พร้อมกันเยอะ ๆ อาจจะมีปัญหาได้เลย !!

เรื่องที่ห้า การจัดการ configuration ต่าง ๆ

อย่างแรกไม่ควรใช้งาน Spring profile แบบ hard code กัน เช่นมีกี่ environment ก็มี profile แยกกัน load file แยกกัน ต้อง build ใหม่ทุก ๆ environment เนื่องจากก่อให้เกิดความผิดพลาดมากมายตามมา เคยไหมทำการ build ผิด profile !! แนะนำให้ใช้ environment variable จาก OS นั้น ๆ ดีกว่า หรือไปใช้พวก external configuration server เป็นต้น

เรื่องที่หก เขียน test ด้วยละ

Spring Boot นั้น เขียนไว้เลยว่า สำหรับสร้าง Testable application เขาก็มี library ของการทดสอบมาให้ด้วย

  • ทั้ง Spring Boot Test
  • ทั้ง Slice test
  • ทั้ง Unit test
  • ทั้ง Contract test
  • ทั้ง Component test

ก็เขียนกันด้วยละ ไม่ใช้มี test case เดียวตลอดทั้ง project ซะงั้น !!

เรื่องอื่น ๆ ที่สำคัญไม่แพ้กัน ก็เช่น

  • Logging framework
  • Error handling
  • Transaction management
  • Metric ด้วย Spring Boot Actuator
  • Circuit breaker

เขียนไปเขียนมาเยอะเกินไปแล้ว พอดีกว่า !!

ปล. คำถามสุดท้าย ใช้งาน Spring Boot version อะไรอยู่ ?

คำตอบที่ได้กลับมาสยองมาก ๆ คือ ยังไม่ 2 เลย !!

0
232