Full-Stack Tiered Architecture & HTTP Lifecycle
ข้อสอบเน้น flow ทั้งระบบ ไม่ใช่ syntax เดี่ยว ๆ — ต้องตอบได้ว่าเมื่อผู้ใช้กดปุ่มหนึ่งครั้ง ข้อมูลวิ่งผ่านชั้นไหนบ้าง แต่ละชั้นทำอะไร และตอบกลับด้วย status อะไร
4 ส่วนของระบบ e-commerce
| ส่วน | เปรียบเทียบ | ทำหน้าที่ | เทคโนโลยี |
|---|---|---|---|
| User Interface (Frontend) | หน้าร้าน | ให้ลูกค้าโต้ตอบกับสินค้า | HTML, CSS, JavaScript |
| Backend | สมอง / ผู้จัดการ | จัดการ logic ความปลอดภัย และการสื่อสาร | Node.js, Express |
| Database | ความจำ / คลังสินค้า | เก็บข้อมูลถาวร เช่น สต็อก บัญชีผู้ใช้ | SQLite |
| API | คนส่งสาร | ให้ frontend คุยกับ backend | JSON, HTTP |
3 Tier และหน้าที่ของแต่ละชั้น
การแยกชั้นทำให้แต่ละชั้นเปลี่ยนแปลงได้อิสระ และสลับ client ได้ (เว็บ / มือถือ ใช้ backend เดียวกัน)
| Layer | Responsibility | Tools |
|---|---|---|
| Presentation Layer | What the user sees — layout, design, การโต้ตอบ | HTML, CSS, JavaScript, Bootstrap |
| Logic Layer | What the app does — validate ข้อมูล คำนวณยอด สื่อสารระหว่าง service | Node.js, Express |
| Persistence Layer | What the app remembers — เก็บโปรไฟล์ สินค้า ประวัติคำสั่งซื้อ | SQLite, JSON files |
กับดักข้อสอบ: การ validate ที่ Presentation layer เป็นเรื่อง UX เท่านั้น
ความถูกต้องจริงต้องตรวจซ้ำที่ Logic layer เสมอ เพราะผู้ใช้แก้ค่าใน DevTools ได้
Client–Server
- Client (ผู้ขอ) — เบราว์เซอร์หรือแอปมือถือ เป็นหน้าจอที่ผู้ใช้ใช้งาน
- Server (ผู้ให้) — เครื่องระยะไกลที่รอรับ request ประมวลผล logic แล้วส่งข้อมูลกลับ
Request : Client ขอทรัพยากร เช่น "ขอ index.html" หรือ "เช็ค login" ผ่าน HTTP/HTTPS Response: Server ส่งทรัพยากรกลับ หรือส่ง error เช่น "200 OK" หรือ "404 Not Found"
HTTP Lifecycle 7 ขั้นตอน
1 DNS · 2 TCP/TLS · 3 ส่ง request · 4 server ประมวลผล · 5 สร้าง response · 6 ส่งกลับ · 7 เบราว์เซอร์ render
- Initiation & DNS Lookup — เบราว์เซอร์แปลงชื่อโดเมนเป็น IP
- TCP/TLS Handshake — สร้างการเชื่อมต่อที่ปลอดภัย ใช้เวลาราว 100ms
- Sending the Request — ส่ง method, URL, headers และ body (ถ้ามี)
- Server Processing — ผ่าน middleware (auth / logging) แล้วเข้า application layer
- Generating the Response — สร้าง status code + headers + content
- Sending the Response — ส่งกลับผ่านการเชื่อมต่อเดิม
- Rendering — เบราว์เซอร์ parse HTML/CSS/JS แล้ววาดหน้าจอ
HTTP Methods
| Method | ความหมาย | ตัวอย่าง | มี body ไหม |
|---|---|---|---|
| GET | อ่านข้อมูล (Read) | GET /api/products | ไม่มี |
| POST | สร้างข้อมูลใหม่ (Create) | POST /api/checkout | มี |
| PUT / PATCH | แก้ข้อมูลเดิม (Update) | PATCH /api/products/1 | มี |
| DELETE | ลบข้อมูล (Destroy) | DELETE /api/cart/5 | ปกติไม่มี |
PUT vs PATCH: PUT แทนที่ทรัพยากรทั้งชิ้น ส่วน PATCH แก้เฉพาะบางฟิลด์
Status Codes
| กลุ่ม | ความหมาย | ตัวที่ต้องจำ |
|---|---|---|
| 2xx | สำเร็จ | 200 OK, 201 Created |
| 3xx | เปลี่ยนเส้นทาง | 301, 302 |
| 4xx | ฝั่ง client ผิด | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found |
| 5xx | ฝั่ง server ผิด | 500 Internal Server Error |
ข้อสอบชอบถาม: ส่งข้อมูลไม่ครบ/ผิดรูปแบบ → 400 ·
ไม่ได้ล็อกอินหรือ token ไม่ถูกต้อง → 401 · ล็อกอินแล้วแต่ไม่มีสิทธิ์ → 403 ·
ไม่มีทรัพยากรนั้น → 404 · โค้ดฝั่ง server พัง → 500
โครงสร้าง Request / Response
ทุกข้อความมี 2 ส่วน: Header (ข้อมูลกำกับ เช่น "ฉันคือใคร" "อยากได้รูปแบบไหน") และ Body (ข้อมูลจริง)
REQUEST RESPONSE
-------------------------------- --------------------------------
Method : GET Status : 200 OK
Endpoint : /api/products Headers : Content-Type: application/json
Headers : Accept: application/json Body : [{"id":1,"name":"Laptop","price":999}, ...]
Body : (ว่าง สำหรับ GET)
ตารางนี้เรียกว่า "Contract" Table — เป็นข้อตกลงระหว่าง frontend กับ backend ที่ต้องเขียนก่อนลงมือโค้ด
กระบวนการพัฒนา 4 ขั้น
- Requirements & Prerequisites — กำหนดกฎธุรกิจ เช่น "ผู้ใช้ต้องล็อกอินก่อนถึงจะ checkout ได้"
- Logical Design — วาด flowchart หรือ sequence diagram ให้เห็นเส้นทางข้อมูลจากปุ่ม "Buy" ถึง database ก่อนเขียนโค้ด
- Construction — สร้างแบบแยกส่วน (modular / microservices) เพื่อให้ขยายระบบได้
- Validation & Deployment — ทดสอบว่า logic ทำงานตามที่ตั้งใจ แล้ว deploy เช่นขึ้น GitHub Pages
AI เป็น "ผู้ช่วย" แต่ UML คือ "ผู้จัดการ" — ถ้าไดอะแกรมผิด AI จะเขียนโค้ดที่ "สมบูรณ์แบบ" ให้กับโจทย์ที่ผิด
Git & Conventional Commits
| คำ | ความหมาย |
|---|---|
| Repository | โฟลเดอร์ดิจิทัลที่เก็บไฟล์โปรเจกต์พร้อมประวัติทั้งหมด |
| Commit | "ภาพนิ่ง" ของโค้ด ณ เวลาหนึ่ง พร้อมข้อความอธิบายว่าเพิ่ม logic อะไร |
| Push | ส่งงานจากเครื่องตัวเองขึ้น remote server (GitHub) |
รูปแบบ: type(optional-scope): description feat : ฟีเจอร์ใหม่สำหรับผู้ใช้ fix : แก้บั๊ก docs : แก้เอกสารอย่างเดียว style : เปลี่ยนที่ไม่กระทบความหมายของโค้ด (เว้นวรรค จัดรูปแบบ) refactor : ปรับโครงสร้างโค้ด ไม่ใช่ทั้งแก้บั๊กและไม่ใช่ฟีเจอร์ใหม่ test : เพิ่มหรือแก้เทสต์
เหตุผลที่ใช้รูปแบบนี้: ทำ automated versioning, สร้าง changelog ที่มีความหมาย และ review โค้ดได้เร็วขึ้น
แนวข้อสอบอัตนัย
โจทย์: ผู้ใช้แก้ราคาสินค้าเป็น $0 ใน Browser Console แล้วกด "Buy" ระบบบันทึกคำสั่งซื้อราคา $0 สำเร็จ จงอธิบายปัญหา สาเหตุทางเทคนิค ผลกระทบ และวิธีแก้เชิงสถาปัตยกรรม
โครงคำตอบ 4 ขั้น
- ปัญหา — ระบบเชื่อราคาที่ client ส่งมา ทำให้สั่งซื้อของราคา $0 ได้
- สาเหตุทางเทคนิค — validation ทำอยู่แค่ Presentation tier ซึ่งผู้ใช้แก้ได้ทั้งหมดผ่าน DevTools ส่วน Logic tier รับ
req.body.priceมาใช้คำนวณตรง ๆ โดยไม่ตรวจซ้ำ - ผลกระทบ — สูญเสียรายได้โดยตรง ข้อมูลยอดขายผิด สต็อกถูกตัดโดยไม่ได้เงิน และเป็นช่องให้ทำซ้ำเป็นวงกว้าง
- วิธีแก้เชิงสถาปัตยกรรม — Logic tier ต้องไม่รับราคาจาก client เลย ให้ส่งมาแค่
productIdและquantityแล้ว server ดึงราคาจริงจาก Persistence tier มาคำนวณเอง พร้อมตรวจสต็อกและตอบ 400 เมื่อข้อมูลไม่สมเหตุสมผล