@ModelAttribute는 폼 데이터를 Java 객체에 바인딩하기 위해 사용됩니다.
객체의 필드에 값을 설정하기 위해 setter 메서드가 필요합니다.
객체 생성 및 필드 설정
@ModelAttribute
는 요청 파라미터를 기반으로 새로운 객체를 생성하고, 각 필드에 값을 설정합니다. 이 과정에서 리플렉션이 사용되지만, 필드에 직접 접근하는 대신 setter 메서드를 통해 값을 설정합니다. 이는 Java의 접근 제어 원칙에 따라 필드에 직접 접근하는 것을 피하기 위해서 입니다. 예시
public class User {
private String name;
private int age;
// Setter 메서드가 필요합니다.
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
@RestController
public class UserController {
@PostMapping("/register")
public ResponseEntity<String> register(@ModelAttribute User user) {
return ResponseEntity.ok("Registered: " + user.getName() + ", Age: " + user.getAge());
}
}
@RequestParam과 @ResponseBody는 리플렉션을 통해 직접 매개변수에 값을 할당할 수 있지만, @ModelAttribute는 객체의 필드에 값을 설정하기 위해 setter 메서드를 요구합니다. 이는 객체 지향 프로그래밍의 캡슐화 원칙을 준수하기 위한 설계입니다.
@ParameterObject는 메서드의 매개변수로 객체를 사용하여 여러 개의 요청 파라미터를 묶어 전달할 수 있도록 해주는 어노테이션입니다. 이 어노테이션을 사용하면, 여러 개의 쿼리 파라미터를 하나의 객체로 매핑할 수 있어 코드가 더 깔끔해지고 가독성이 향상됩니다.
@ParameterObject
를 사용하면 이러한 파라미터를 하나의 객체로 묶어 관리할 수 있습니다. 이는 코드의 가독성을 높이고, 유지보수를 용이하게 합니다.@ParameterObject
를 사용하면 OpenAPI에서 해당 객체의 모든 필드를 문서화할 수 있습니다. 이는 API 소비자에게 각 필드의 의미와 형식을 명확하게 전달하는 데 도움이 됩니다.@ParameterObject
를 사용하면 Swagger UI에서 요청 파라미터가 객체로 표현되므로 사용자에게 더 나은 경험을 제공합니다. 사용자들은 객체의 각 필드에 대해 이해하고 입력할 수 있습니다.
@ModelAttribute
사용 시 Swagger UI에서 Object 형식으로 제공된다.
@ParameterObject
사용 시 Reqeust 객체 정보가 자세하게 표기된다.
OpenAPI 3.0에서는 @ParameterObject를 사용하는 것이 권장됩니다. 이는 복잡한 요청 파라미터를 처리하고, API 문서의 가독성을 높이며, 사용자에게 더 나은 경험을 제공합니다. 특히 GET 메서드에서 여러 쿼리 파라미터를 다룰 때, @ParameterObject는 매우 유용한 선택입니다.