การสร้าง REST API แรกด้วย Spring WebFlux

Sharing is caring!

Spring WebFlux คือ Web Framework ที่พัฒนาโดย Spring Team เพื่อรองรับระบบที่ต้องการ non-blocking, asynchronous และ reactive โดยใช้ Project Reactor ในบทความนี้เราจะมาสร้าง REST API แรกแบบง่าย ๆ ด้วย Spring WebFlux โดยใช้ Annotation-based Controller

เริ่มต้นด้วยโครงสร้าง Project

เราจะใช้ Spring Initializr (https://start.spring.io/) ในการสร้างโปรเจกต์

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.x หรือใหม่กว่า
  • Dependencies: Spring Reactive Web

ไฟล์ pom.xml

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
  </dependency>
</dependencies>
  

สร้าง Controller แบบ Reactive

เราจะสร้าง REST API ชื่อว่า /api/hello ที่ตอบกลับข้อความ “Hello from WebFlux!”

@RestController
@RequestMapping("/api")
public class HelloController {

  @GetMapping("/hello")
  public Mono<String> sayHello() {
    return Mono.just("Hello from WebFlux!");
  }
}
  

คำอธิบาย

  • @RestController: ระบุว่า class นี้คือ controller
  • Mono<String>: ใช้สำหรับส่งข้อมูลแบบ reactive ที่มีค่าเดียว
  • @GetMapping("/hello"): แมป HTTP GET ไปยังเมธอดนี้

ทดสอบ API ด้วย curl หรือ Postman

curl http://localhost:8080/api/hello
# Output: Hello from WebFlux!
  

ภาพประกอบ: ลักษณะการทำงานของ WebFlux

เพิ่ม Service Layer

เพื่อความเป็นระเบียบ เราสามารถแยก logic ออกมาไว้ที่ service

@Service
public class HelloService {
  public Mono<String> getGreeting() {
    return Mono.just("Hello from Service!");
  }
}
  
@RestController
@RequestMapping("/api")
public class HelloController {

  private final HelloService helloService;

  public HelloController(HelloService helloService) {
    this.helloService = helloService;
  }

  @GetMapping("/hello")
  public Mono<String> sayHello() {
    return helloService.getGreeting();
  }
}
  

เพิ่ม Dependency Injection แบบ Constructor

Spring Boot รองรับการฉีด dependencies โดยใช้ constructor ทำให้ code มีความชัดเจนและ test ได้ง่าย

เพิ่ม Router แบบ Functional

Spring WebFlux ยังสามารถใช้ RouterFunction แทน Annotation ได้

@Configuration
public class HelloRouter {

  @Bean
  public RouterFunction<ServerResponse> route() {
    return RouterFunctions
      .route(RequestPredicates.GET("/api/fun"), 
        req ->; ServerResponse.ok().bodyValue("Hello from Functional Route!"));
  }
}
  

ข้อดีของ Spring WebFlux

  • Non-blocking: ประหยัด thread และ scale ได้ดี
  • Reactive: เหมาะกับ stream, websocket และ real-time app
  • รองรับทั้ง annotation และ functional programming

ข้อจำกัดของ WebFlux

  • Debug ยากกว่าการเขียนแบบ blocking
  • ไม่เหมาะกับระบบที่ต้องพึ่ง library ที่ไม่รองรับ reactive

โครงสร้างโปรเจกต์สุดท้าย

src/
├── main/
│   ├── java/
│   │   └── com/example/demo/
│   │       ├── HelloController.java
│   │       ├── HelloService.java
│   │       └── HelloRouter.java
│   └── resources/
│       └── application.properties
  

สรุป

การสร้าง REST API แรกด้วย Spring WebFlux เป็นการเปิดประตูสู่โลก reactive ที่สามารถพัฒนาระบบที่รองรับผู้ใช้งานจำนวนมาก โดยยังคงความเรียบง่ายของ Spring Framework เดิม หากคุณต้องการ performance และ scalability ที่สูง Spring WebFlux คือเครื่องมือที่ตอบโจทย์

แหล่งเรียนรู้เพิ่มเติม

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *