ขอบ HTTP ของคลินิก — สัญญาที่ผู้เรียกปลายสายอ่านออก
เส้นทางการเรียน
หัวข้อที่มีชื่อว่า “เส้นทางการเรียน”แปดบท เรียงตามระยะทางที่ความถูกต้องข้างในต้องเดินทาง กว่าจะถึงผู้เรียก
คอร์สนี้เขียนให้ใคร
หัวข้อที่มีชื่อว่า “คอร์สนี้เขียนให้ใคร”คุณเขียน controller เป็นอยู่แล้ว และเคยเห็น 500 ที่อธิบายอะไรไม่ได้มาแล้ว
คอร์สนี้ไม่ได้เริ่มที่ว่า @RestController คืออะไร · มันเริ่มที่คำถามว่า
สิ่งที่คุณสร้างไว้ถูกต้องแล้ว ออกไปถึงคนที่เรียกใช้หรือเปล่า
ถ้ายังไม่เคยผ่านคอร์สก่อนหน้า ไปที่ คอร์ส Kotlin + Spring Boot + Clean Architecture ก่อนได้ · คอร์สนี้ใช้โปรเจกต์เดียวกันต่อ ไม่ได้เริ่มใหม่
คำถามที่คอร์สนี้ตอบ
หัวข้อที่มีชื่อว่า “คำถามที่คอร์สนี้ตอบ”ไม่ใช่ “ตอบกลับอย่างไรให้สวย” แต่เป็น “ผู้เรียกทำอะไรต่อได้จากสิ่งที่เราตอบไป”
คำขอที่ผิดกับระบบที่พังจริง ตอบกลับด้วย body รูปเดียวกันเป๊ะ ต่างกันแค่ตัวเลข · ผู้เรียกจึงแยกสองอย่างนี้ออกจากกันไม่ได้ นอกจากจะเดา
และเมื่อฐานข้อมูลกันข้อมูลที่ขัดกันไว้ได้สำเร็จ สิ่งที่ออกไปคือ 500 ซึ่งแปลว่าเราพัง · ผู้เรียกที่อ่านรหัสนั้นจะลองใหม่ ทั้งที่ลองกี่ครั้งก็ชนเหมือนเดิม
สิ่งที่คุณจะได้สร้าง
หัวข้อที่มีชื่อว่า “สิ่งที่คุณจะได้สร้าง”ขอบ HTTP ของระบบจองคิวคลินิกตัวเดิม — ไม่ได้เริ่มโปรเจกต์ใหม่
โดเมนกับ repository ของคอร์สก่อนอยู่ครบ · สิ่งที่เพิ่มเข้ามาคือชั้นที่คุยกับโลกข้างนอก และเทสต์ที่บังคับว่าชั้นนั้นพูดตรงกับที่สัญญาไว้
คอร์สนี้พิสูจน์อะไรบ้าง
หัวข้อที่มีชื่อว่า “คอร์สนี้พิสูจน์อะไรบ้าง”หกข้อ · ทุกข้อมีคำสั่งที่คุณรันเองแล้วเห็นค่าเดียวกัน
- body ค่าตั้งต้นบอกผู้เรียกไม่ได้ว่าอะไรผิด — สี่คีย์ และไม่มีคีย์ไหนชี้ที่ช่องที่ผิด
- คำขอที่ผิดกับ exception ที่หลุด ได้ body รูปเดียวกัน — เทียบชื่อคีย์ทีละตัว
- ตัวจัดการที่เขียนไว้อาจไม่เคยรันเลย — พิสูจน์ด้วย marker ที่ไม่มีทางบังเอิญตรง
problemdetailsแก้ครึ่งเดียว — content-type เปลี่ยน แต่ความขัดแย้งยังเป็น 500- 23P01 แปลงเป็น 409 ได้ — และจำนวนแถวไม่เปลี่ยน ซึ่งเป็นช่องควบคุม
- คีย์เดิมกับคีย์ใหม่ต้องได้คำตอบคนละแบบ — วัดด้วย
idที่คืนมาและจำนวนแถว
คอร์สนี้จงใจไม่ทำอะไร
หัวข้อที่มีชื่อว่า “คอร์สนี้จงใจไม่ทำอะไร”สี่ข้อที่ตัดออก พร้อมเหตุผลของแต่ละข้อ
- ไม่สอน REST ตั้งแต่ต้น ผู้อ่านเขียน controller เป็นอยู่แล้ว · คอร์สนี้เริ่มที่สิ่งที่ controller ตอบออกไป ไม่ใช่ที่วิธีเขียนมัน
- ไม่แตะเรื่องความปลอดภัย การยืนยันตัวตนกับสิทธิ์เป็นคอร์สของตัวเอง
- ไม่วัดความเร็ว ทั้งคอร์สไม่มีหน่วยเวลาสักตัว · หน่วยที่ใช้คือรหัส HTTP · content-type · ชื่อและจำนวนคีย์ใน body · ชนิดของ exception · SQLSTATE · จำนวน link · จำนวนแถว
- ไม่ทำหน้าจอ ทุกอย่างในคอร์สนี้วัดจากคำขอกับคำตอบ
คอร์สนี้ต่างจากคอร์สก่อนหน้าตรงไหน
หัวข้อที่มีชื่อว่า “คอร์สนี้ต่างจากคอร์สก่อนหน้าตรงไหน”ข้อที่ต้องพูดออกมาก่อน เพราะสองคอร์สนี้ใช้โปรเจกต์เดียวกัน
คอร์สก่อนหน้า ถามว่าอะไรบังคับให้โครงสร้างข้างใน ยังถูกต้องอยู่ · คำตอบของมันคือ compiler กับฐานข้อมูล และมันพิสูจน์ทั้งสองอย่างจนจบ
คอร์สนี้รับช่วงต่อที่ประตูทางออก · มันสมมติว่าข้างในถูกต้องแล้ว แล้วถามว่า ความถูกต้องนั้นเหลืออะไรอยู่บ้าง เมื่อออกไปถึงคนที่เรียกใช้
ของที่ต้องมีบนเครื่อง
หัวข้อที่มีชื่อว่า “ของที่ต้องมีบนเครื่อง”สี่อย่าง · และมีข้อหนึ่งที่ต้องระวังเพราะคอร์สก่อนใช้ของชื่อคล้ายกัน
- JDK 25 ตรึงด้วย
jvmToolchain(25)เหมือนคอร์สก่อน - Gradle 9.7.1 กับ Kotlin DSL
- Docker สำหรับ PostgreSQL 18
- container คนละตัวกับคอร์สก่อน · สั่งด้วย
scripts/clinic-http-boundary/up.sh· ใช้ตัวเดียวกันไม่ได้ เพราะEXCLUDEสร้าง index ที่ชื่อต้องไม่ซ้ำทั้งสคีมา