ข้าม​ไป​ยัง​เนื้อหา

Kotlin + Spring Boot + Clean Architecture — กฎ​ทิศทาง​ที่ compiler บังคับ​ให้

ทุก​ทีม​เขียน​กฎ​ทิศทาง​ไว้​ใน​เอกสาร แล้ว​ก็​เผลอ​ละเมิด​มัน​ภายใน​ไม่​กี่​เดือน เพราะ​ไม่มี​อะไร​บังคับ คอร์ส​นี้​ไม่​เล่า​ซ้ำ​ว่า​กฎ​นั้น​คือ​อะไร มัน​ถาม​ว่า​อะไร​บังคับ​มัน — เรา​แยก​โมดูล​จน​การ import Spring ใน​โดเมน​กลาย​เป็น​ข้อ​ผิด​พลาด​ตอน​แปล แล้ว​เดิน​ไป​หา​ข้อ​ที่ compiler ช่วย​ไม่​ได้ คือ​กติกา​ที่​กว้าง​กว่า aggregate ซึ่ง​ต้อง​มี​คน​บังคับ​ที่​ฐาน​ข้อมูล ทุก​ข้อ​อ้าง​ใน​คอร์ส​นี้​มา​จาก probe ที่​คุณ​รัน​เอง​ได้
ความคืบหน้า0 / 8 บทเรียน

แปดบท เรียง​ตาม​ลำดับ​ที่​กฎ​ทิศทาง​ถูก​ทดสอบ​ที​ละ​ข้อ จนถึง​ข้อ​ที่​มัน​บังคับ​ไม่​ได้

คุณ​เขียน Kotlin ได้​แล้ว และ​อ่าน​เรื่อง Clean Architecture มา​แล้ว​อย่าง​น้อย​รอบ​หนึ่ง

คอร์ส​นี้​ไม่​ได้​เริ่ม​ที่​ว่า data class คือ​อะไร · ถ้า​ยัง​ไม่​เคย​เขียน Kotlin ให้​ไป​ที่ คอร์ส Kotlin จาก​ศูนย์ ก่อน แล้ว​ค่อย​กลับ​มา

และ​มัน​ไม่​ได้​เริ่ม​ที่​ว่า aggregate คือ​อะไร​ด้วย · เว็บ​นี้​มี​สี่​คอร์ส​ที่​ถือ​เรื่อง​นั้น​อยู่​แล้ว คอร์ส​นี้​ลิงก์​ไป ไม่​เล่า​ซ้ำ

ไม่ใช่ “โครงสร้าง​ที่​ดี​หน้าตา​อย่างไร” แต่​เป็น “อะไร​บังคับ​มัน​หลัง​จาก​คุณ​เขียน​มัน​ลง​ไป​แล้ว”

เอกสาร​ออกแบบ​ไม่​บังคับ​อะไร · การ​รีวิว​บังคับ​ได้​เท่า​ที่​คน​อ่าน​ทัน · สิ่ง​ที่​บังคับ​ได้​จริง​มี​สอง​อย่าง​เท่านั้น คือ compiler กับ​ฐาน​ข้อมูล

คอร์ส​นี้​จึง​เรียง​ตาม​ลำดับ​ที่ กฎ​แต่ละ​ข้อ​ย้าย​จาก​เอกสาร​ไป​อยู่​ใน​เครื่อง​มือ และ​หยุด​ตรง​ที่​มัน ย้าย​ไม่​ได้ แล้ว​บอก​ว่า​ตรง​นั้น​ต้อง​ทำ​อย่างไร​แทน

ระบบ​จอง​คิว​คลินิก — ไม่ใช่ orderctl และ​ไม่ใช่ ledger

เลือก​โดเมน​นี้​เพราะ​กติกา​หลัก​ของ​มัน​บังคับ​ใน aggregate เดียว​ไม่​ได้

หมอ​คน​หนึ่ง​มี​นัด​ซ้อน​เวลา​กัน​ไม่​ได้

การ​ตรวจ​ข้อ​นี้​ต้อง​ดู​นัด​ของ​หมอ​คน​นั้น​ทั้งหมด ซึ่ง​อยู่​นอก​นัด​ใบ​ที่​กำลัง​จะบัน​ทึก · โดเมน​ตรวจ​ได้​เฉพาะ​ที่​มัน​มอง​เห็น · สอง request ที่​ผ่าน​ด่าน​โดเมน​พร้อม​กัน จึง​ยัง​สร้าง​แถว​ที่​ซ้อน​กัน​ได้​จริง และ​เรา​จะ​ทำให้​มัน​เกิด​ขึ้น​ให้​ดู​ใน​บท​ที่ 6

หก​ข้อ · ทุก​ข้อ​มี​คำ​สั่ง​ที่​คุณ​รัน​เอง​แล้ว​เห็น​ตัวเลข​เดียวกัน

  • กฎ​ทิศทาง​บังคับ​ด้วย build ได้ — import Spring ใน domain แล้ว​แปล​ไม่​ผ่าน · เอา​บรรทัด​นั้น​ออก​แล้ว​เขียว​ทันที
  • JPA ดึง​ตัว​เอง​เข้าไป​หา entity — build เขียว · context ส​ตาร์ต​ขึ้น · คำ​เตือน​เดียว​ที่​มี​อยู่​ที่​ระดับ INFO · แล้ว​มัน​ตาย​ที่ save() ครั้ง​แรก
  • การ​แยก persistence model มี​ราคา — นับ​เป็น​จำนวน​บรรทัด​ของ​ทั้ง​สอง​ทาง
  • โดเมน​กัน​จอง​ซ้อน​เอง​ไม่​ได้ — สอง session ผ่าน​ด่าน​โดเมน​ทั้ง​คู่ แล้ว​แถว​ซ้อน​กัน​เกิด​จริง
  • optimistic locking ทำงาน​จริง — อ่าน​จาก​ชนิด​ของ exception ที่ Spring โยน​ออก​มา
  • ทดสอบ​โดเมน​ได้​โดย​ไม่มี Spring — วัด​ด้วย​จำนวน bean ที่​โหลด

สี่​ข้อ​ที่​ตัด​ออก พร้อม​เหตุผล​ของ​แต่ละ​ข้อ

  • ไม่​สอน DDD ตั้งแต่​ต้น เว็บ​นี้​มี​สี่​คอร์ส​ที่​ถือ​เรื่อง​นั้น​อยู่​แล้ว · คอร์ส​นี้​ลิงก์​ไป​ที่ คอร์ส DDD ไม่​เล่า​ซ้ำ
  • ไม่​เทียบ framework ไม่มี Ktor ไม่มี Micronaut · คำถาม​ของ​คอร์ส​นี้​เป็น​คำถาม​เรื่อง​โครงสร้าง ไม่ใช่​เรื่อง​การ​เลือก​ของ
  • ไม่​วัด​ความเร็ว ทั้ง​คอร์ส​ไม่มี​หน่วย​เวลา​สัก​ตัว · หน่วย​ที่​ใช้​คือ​รหัส​ออก · SQLSTATE · ชนิด​และ​ข้อความ​ของ exception · จำนวน​บรรทัด · จำนวน bean · จำนวน​แถว
  • ไม่​สอน Kotlin พื้น​ฐาน ผู้​อ่าน​ที่​ยัง​ไม่​เคย​เขียน​ให้​ไป​ที่​คอร์ส​ก่อน​หน้า

คอร์ส​นี้​ต่าง​จาก​คอร์ส Clean Architecture ที่​มี​อยู่​แล้ว​ตรง​ไหน

หัวข้อ​ที่​มีชื่อ​ว่า “คอร์ส​นี้​ต่าง​จาก​คอร์ส Clean Architecture ที่​มี​อยู่​แล้ว​ตรง​ไหน”

ข้อ​ที่​ต้อง​พูด​ออก​มา​ก่อน เพราะ​เว็บ​นี้​มี​คอร์ส​ชื่อ​คล้าย​กัน​อยู่​แล้ว

คอร์ส Clean Architecture บน .NET สอน​ว่า​ชั้น​แต่ละ​ชั้น รับ​ผิด​ชอบ​อะไร และ​วาง​ของ​อย่างไร​ให้ dependency ชี้​เข้า​ใน · มัน​ตอบ​คำถาม​ว่า​โครงสร้าง​ควร​เป็น​อย่างไร

คอร์ส​นี้​รับ​ช่วง​ต่อ​จาก​ตรง​นั้น · มัน​สมมติ​ว่า​คุณ​ตกลง​เรื่อง​โครงสร้าง​ได้​แล้ว แล้ว​ถาม​คำถาม​ถัด​ไป​ว่า อะไร​ทำให้​ข้อ​ตกลง​นั้น​ยัง​จริง​อยู่​ใน​อีก​หก​เดือน

สี่​อย่าง · และ​มี​ข้อ​หนึ่ง​ที่​ทำให้ Gradle หา JDK ไม่​เจอ​ถ้า​ตั้ง​ผิด​ชั้น

  • JDK 25 และ​ตรึง​ด้วย jvmToolchain(25) ไม่ใช่​ปล่อย​ตามใจ JDK ที่ Gradle รัน​อยู่
  • Gradle 9.7.1 กับ Kotlin DSL · โปร​เจ​กต์​เป็น multi-module ตั้งแต่​บท​ที่ 1
  • Docker สำหรับ PostgreSQL 18 · เริ่ม​ใช้​จริง​ตั้งแต่​บท​ที่ 3
  • org.gradle.java.installations.paths ใน gradle.properties ถ้า JDK ของ​คุณ​มา​จาก Homebrew · บท​ที่ 1 อธิบาย​ว่า​ทำไม และ​ทำไม​ต้อง​ชี้​ลึก​กว่า​ที่​คิด​หนึ่ง​ชั้น