programing

스프링 : @모델속성 VS @RequestBody

newsource 2023. 9. 17. 13:16

스프링 : @모델속성 VS @RequestBody

제가 틀렸다면 고쳐주세요.둘 다 Data Binding에 사용할 수 있습니다.

문제는 @ModelAttribute를 언제 사용하느냐는 것입니다.

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Pet pet) { }

또한 @RequestBody는 언제 사용해야 합니까?

@RequestMapping(value = "/user/savecontact", method = RequestMethod.POST
public String saveContact(@RequestBody Contact contact){ }

제가 알기로는 둘 다 비슷한 목적을 가지고 있다고 합니다.

감사합니다!!

제가 이해할 수 있는 가장 간단한 방법은@ModelAttribute는 쿼리 문자열을 사용하므로 모든 데이터가 URL을 통해 서버로 전달됩니다.

에 관해서는@RequestBody 본문을 됩니다. , , 를 JSON 됩니다 로 는 됩니다 로 를 는

@ModelAttribute 매개변수 값 쌍)에서를 바인딩하는 데되며,를는데다키값쌍서키(쌍값다s데개grda .

그렇지만@RequestBodyPOST, PUT.. 요청 유형과 같이 요청의 전체에서 데이터를 바인딩하는 데 사용되며 json, xml과 같은 다른 형식을 포함합니다.

파일 업로드를 하려면 다음을 사용해야 합니다.@ModelAttribute.와 함께@RequestBody리가 없어요

@RestController
@RequestMapping(ProductController.BASE_URL)
public class ProductController {

    public static final String BASE_URL = "/api/v1/products";

    private ProductService productService;

    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public ProductDTO createProduct(@Valid @ModelAttribute ProductInput productInput) {
        return productService.createProduct(productInput);
    }

}

제품입력반

@Data
public class ProductInput {

    @NotEmpty(message = "Please provide a name")
    @Size(min = 2, max = 250, message = "Product name should be minimum 2 character and maximum 250 character")
    private String name;

    @NotEmpty(message = "Please provide a product description")
    @Size(min = 2, max = 5000, message = "Product description should be minimum 2 character and maximum 5000 character")
    private String details;

    @Min(value = 0, message = "Price should not be negative")
    private float price;

    @Size(min = 1, max = 10, message = "Product should have minimum 1 image and maximum 10 images")
    private Set<MultipartFile> images;
}

요청의 내용을 완벽하게 제어할 수 있고 내용이 XML 또는 JSON(잭슨으로 인해)으로 전송되는 AJAX 요청의 경우 @RequestBody(클래스에 @RestController로도 주석 달림)가 더 낫다는 것을 알게 되었습니다.이렇게 하면 컨텐츠가 모델 개체를 쉽게 만들 수 있습니다.반대로 @ModelAttribute는 폼을 지원하는 "명령" 개체가 있는 폼에 더 적합한 것으로 보입니다(꼭 모델 개체가 아닐 수도 있음).

ModelAttribute 주석을 사용하는 경우 뷰 계층에서 "pet" 개체에 직접 액세스할 수 있습니다.또한 이 개체를 컨트롤러에 있는 방법으로 인스턴스화하여 모델을 배치할 수도 있습니다.이거 봐요.

ModelAttribute는 이 개체를 부분적으로 사용할 수 있는 기회를 제공하지만 RequestBody를 사용하면 모든 요청 본문을 얻을 수 있습니다.

@ModelAttribute와 @RequestBody 둘 다 동일한 용도를 가지고 있다고 생각합니다. 다만 차이점은 정상적인 스프링 MVC의 경우 @ModelAttribute 사용과 REST 웹 서비스의 경우 @RequestBody 사용입니다.@PathVariable 및 @PathParam입니다.그러나 두 경우 모두 혼합할 수 있습니다. REST에서 @PathVariable을 사용할 수도 있고 그 반대도 가능합니다.

@ModelAttribute를 사용하면 URL 파라미터로 데이터를 전달하고 @RequestBody를 사용하면 JSON 본문으로 전달합니다.REST API를 만들고 있다면 @RequestBody를 사용하는 것이 좋습니다.대부분의 유튜브 튜토리얼에서 @ModelAttribute를 사용할 수 있습니다. 이는 단순히 Spring MVC에 대한 개념을 보여주고 URL을 사용하여 데이터를 전달하기 때문입니다.

데이터를 jsp 폼 필드에 바인딩하려면 다음 jsp 태그가 있어야 합니다.
양식은 스프링 태그 라이브러리에서 가져온 것입니다.
다음은 전체 html은 아니지만, 자신과 관련이 있기를 바랍니다.

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

        <form:form action="save" method="post" modelAttribute="patient">
            <table>
                <tr>
                    <td>Name</td>
                    <td>
                        <form:input path="patient.patient_name"  /> <br />
                        
                    </td>
                </tr>
                <tr>
                    <td>Phone</td>
                    <td>
                        <form:input path="patient.phone_number" /> <br />
                    </td>
                </tr>
                <tr>
                    <td colspan="2"><button type="submit">Submit</button></td>
                </tr>
            </table>
        </form:form>

을 두 번 값에 대한 . 양식을 렌더링하려면 양식을 렌더링해야 합니다. 을 렌더링하는 동안 속성 값에 대한 적절한 Bean 인스턴스화를 제공해야 합니다. 양식을 렌더링하려면 양식을 사용해야 합니다.modelAttribute="patient".

  1. 를 위해서는 (에서) 클래스에 를 ( 한 )가 있어야 합니다.@RequestMapping주석.
  2. 다음과 같은 핸들러 메서드 매개 변수가 있어야 합니다.
@GetMapping("logincreate")

public String handleLoginCreate(@ModelAttribute("login") Login login, Model model)
{
    System.out.println(" Inside handleLoginCreate  ");
    model.addAttribute("login",login);
    return "logincreate";
}

은 모든 메소드 이 를 을 스캔합니다.@ModelAttribute그리고 Login 클래스의 기본 생성자로 인스턴스화하고 모든 getter 및 setter를 호출합니다(폼에서 "로그인"으로 바인딩되는 jsp의 경우).중.도면 jsp지다음가다te음n면n중jps도가fytepeg 다양한 예외가 표시됩니다.

  1. 게터들/세터
  2. 기본 생성자
  3. model.adattribute("로그인", 로그인);
  4. 클래스 수준 @RequestMapping
  5. 메서드 매개 변수 수준 @ModelAttribute

, 의 , jsp 에서의 에서의 에서의 .action="save" 핸들러 과 같이 보일 수 즉, 는 과 과 는

@PostMapping("save")

public String saveLoginDetails(@ModelAttribute("login") Login login, Model model) {
    
    //write codee to insert record into DB
    System.out.println(" Inside save login details  ");
    System.out.println("The login object is " + login.toString());
    System.out.println("The model object contains the login attribute"+ model.getAttribute("login"));   
    loginService.saveLogin(login);
    return "welcome";
}

중요한 학습은 다음과 같습니다.

  1. 에는 폼의. bean"object"는메서드의 변수 주석을 하는 것입니다. 을 하기 에 에는 의 을 이 이 을 을 . 위의 예에서 "백킹 빈" 또는 "바인딩 개체"는 적절한 핸들러 메서드의 매개 변수 주석을 사용한 로그인입니다.@ModelAttribute("login") Login login

@ModelAttribute는 기본적으로 여러 부분의 파일을 본문으로 포함하고자 할 때 사용됩니다.프론트 엔드에서 데이터를 전달하려면 데이터를 JSON으로 변환해야 합니다.심지어 시험 사례 작성도 조금 다릅니다.contentType(MediaType)을 사용해야 합니다.APPLICATION_FORM_URLENCODE)을 컨텐츠 유형으로 지정하고 JSON 문자열 대신 값을 .param("field", 값으로 전달해야 합니다.

@RequestBody:이 주석은 전체 요청 본문을 메서드 매개 변수에 바인딩하는 데 사용됩니다.일반적으로 요청 페이로드가 JSON 또는 XML 형식일 때 사용됩니다.

@PostMapping("/example")
public ResponseEntity<String> handleRequest(@RequestBody ExampleDto exampleDto) {
   // Do something with the exampleDto object
   return ResponseEntity.ok("Request handled successfully");
}

@모델 특성:이 주석은 요청 매개변수(쿼리 문자열 또는 양식 데이터)를 메서드 매개변수 또는 모델 특성에 바인딩하는 데 사용됩니다.일반적으로 HTML 양식과 함께 사용되거나 요청에서 개별 매개변수를 추출하고자 할 때 사용됩니다.

@PostMapping("/example")
public ResponseEntity<String> handleRequest(@ModelAttribute("name") String name, @ModelAttribute("age") int age) {
    // Do something with the name and age parameters
    return ResponseEntity.ok("Request handled successfully");
}

언급URL : https://stackoverflow.com/questions/21824012/spring-modelattribute-vs-requestbody