ในการพัฒนาแอปพลิเคชันด้วย Spring WebFlux โครงสร้างโปรเจกต์ที่ดีจะช่วยให้โค้ดของเรามีระเบียบ ดูแลรักษาง่าย และสามารถขยายระบบได้ในระยะยาว บทความนี้จะพาคุณทำความเข้าใจโครงสร้างพื้นฐานของโปรเจกต์ WebFlux ที่นิยมใช้ พร้อมตัวอย่างโค้ดในแต่ละชั้น (layer)
ภาพหน้าปกบทความ

โครงสร้างโปรเจกต์พื้นฐาน
src/ ├── main/ │ ├── java/ │ │ └── com/example/demo/ │ │ ├── controller/ │ │ │ └── UserController.java │ │ ├── service/ │ │ │ └── UserService.java │ │ ├── model/ │ │ │ └── User.java │ │ └── DemoApplication.java │ └── resources/ │ └── application.properties
1. ชั้น Controller
จัดการ request จาก client และส่งให้ service
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public Mono<User> getUser(@PathVariable String id) {
return userService.findById(id);
}
@GetMapping
public Flux<User> getAllUsers() {
return userService.findAll();
}
}
2. ชั้น Service
ประมวลผล logic ธุรกิจและเรียกใช้งาน repository หรือ mock data
@Service
public class UserService {
private final Map<String, User> mockDb = Map.of(
"1", new User("1", "Alice"),
"2", new User("2", "Bob")
);
public Mono<User> findById(String id) {
return Mono.justOrEmpty(mockDb.get(id));
}
public Flux<User> findAll() {
return Flux.fromIterable(mockDb.values());
}
}
3. ชั้น Model
เก็บข้อมูลในรูปแบบ Object
public class User {
private String id;
private String name;
// Constructor
public User(String id, String name) {
this.id = id;
this.name = name;
}
// Getter & Setter
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
4. Application Entry Point
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
5. Configuration – application.properties
server.port=8080 spring.main.web-application-type=reactive
Tips: Best Practices
- แยกแต่ละ layer ให้ชัดเจน (controller, service, model)
- ใช้ Mono กับข้อมูล 1 ชิ้น และ Flux กับข้อมูลหลายชิ้น
- หลีกเลี่ยงการ block() ใน reactive stream
- จัดเก็บ constant, config, และ error handler แยกไฟล์
การทดสอบ API
curl http://localhost:8080/users curl http://localhost:8080/users/1
สรุป
WebFlux เป็นเครื่องมือที่ทรงพลังสำหรับการสร้าง REST API ที่รองรับ concurrent สูงได้ดี ด้วยโครงสร้างโปรเจกต์ที่ชัดเจนตามแบบ MVC (Controller-Service-Model) จะช่วยให้ทีมพัฒนาเข้าใจและต่อยอดระบบได้ง่ายขึ้น