สอนสร้าง REST API ด้วย Spring Boot
Spring Boot คือเฟรมเวิร์กของ Java ที่ช่วยให้เริ่มโปรเจกต์เซิร์ฟเวอร์ได้เร็ว ค่าตั้งต้นส่วนใหญ่ถูกจัดให้แล้ว เช่น เซิร์ฟเวอร์ Tomcat ในตัว การเชื่อมฐานข้อมูล และการแปลงข้อมูลเป็น JSON บทความนี้จะพาสร้าง REST API ขนาดเล็กที่แบ่งเป็นสามชั้นคือ Controller, Service และ Repository
หมายเหตุการทดสอบ: เครื่องที่ใช้เขียนบทความนี้ไม่มี Maven หรือ Gradle และการดาวน์โหลดไลบรารีของ Spring ยังไม่ได้ทดสอบ โค้ดด้านล่างเป็นรูปแบบมาตรฐาน ควรรันเองตามขั้นตอนและตรวจผลก่อนใช้งานจริง
สิ่งที่ต้องเตรียม
- JDK 17 ขึ้นไป
- Maven หรือ Gradle
- VS Code พร้อมส่วนเสริม Spring Boot หรือ IntelliJ IDEA
ภาพรวมของสามชั้น
ขั้นที่ 1: สร้างโปรเจกต์
ไปที่ https://start.spring.io เลือก Maven, Java 17 และเพิ่มดีเพนเดนซี Spring Web และ Spring Data JPA แล้วดาวน์โหลดและแตกไฟล์
ขั้นที่ 2: สร้างคลาสข้อมูล
package com.example.demo;
import jakarta.persistence.*;
@Entity
public class Note {
@Id
@GeneratedValue
private Long id;
private String title;
public Note() {}
public Note(String title) { this.title = title; }
public Long getId() { return id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
}
ขั้นที่ 3: Repository
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface NoteRepository extends JpaRepository<Note, Long> {
}
Spring Data สร้างเมธอดพื้นฐาน เช่น `findAll`, `save` และ `deleteById` ให้เองจากการสืบทอด `JpaRepository`
ขั้นที่ 4: Service
package com.example.demo;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class NoteService {
private final NoteRepository repository;
public NoteService(NoteRepository repository) {
this.repository = repository;
}
public List<Note> all() {
return repository.findAll();
}
public Note create(String title) {
return repository.save(new Note(title));
}
}
ขั้นที่ 5: Controller
package com.example.demo;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/notes")
public class NoteController {
private final NoteService service;
public NoteController(NoteService service) {
this.service = service;
}
@GetMapping
public List<Note> list() {
return service.all();
}
@PostMapping
public Note create(@RequestBody Note body) {
return service.create(body.getTitle());
}
}
ขั้นที่ 6: รันและทดสอบ
./mvnw spring-boot:run
ทดสอบด้วย curl
curl -X POST http://localhost:8080/api/notes -H "Content-Type: application/json" -d "{\"title\":\"ซื้อกาแฟ\"}"
curl http://localhost:8080/api/notes
ข้อผิดพลาดที่มักพบ
- **ชื่อแพ็กเกจไม่ตรงโครงสร้างโฟลเดอร์:** Spring ค้นหาคลาสจากแพ็กเกจหลัก ควรวางคลาสไว้ภายใต้แพ็กเกจเดียวกับคลาสที่มี `@SpringBootApplication`
- **ไม่ได้เพิ่มดีเพนเดนซีฐานข้อมูล:** การเชื่อมต่อจะล้มเหลว ควรเพิ่มไดรเวอร์และตั้งค่าใน `application.properties`
- **ส่งข้อมูลที่ไม่ถูกต้องโดยไม่ตรวจสอบ:** ควรใช้ Bean Validation เพิ่มการตรวจสอบก่อนบันทึก
ขั้นต่อไป
เพิ่มการตรวจสอบข้อมูล การจัดการข้อผิดพลาดด้วย `@ControllerAdvice` และการทดสอบ Service ด้วย JUnit
สรุป
Spring Boot จัดโครงสร้าง REST API เป็นสามชั้น Controller รับคำขอ Service จัดการตรรกะ และ Repository คุยกับฐานข้อมูล การแบ่งชั้นทำให้โค้ดทดสอบและดูแลได้ง่ายขึ้น