ระหว่างนั่งกินข้าวกลางวัน มีคำถามเกี่ยวกับการพัฒนา 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 เลย !!
สวัสดี