RequestBody, ModelAttribute, RequestParam

corncheese·2023년 12월 4일
0

Spring

목록 보기
6/8

Spring에서 Client로 받은 요청을 객체로 바인딩하기 위해 사용하는 방법들

본 포스팅은 작성자의 학습 목적으로 작성되었으며,
https://mangkyu.tistory.com/72, (도서)배워서 바로 쓰는 스프링 프레임워크를 참고하여 작성되었습니다 :)

1. @RequestParam

( -> HttpServletRequest의 request.getParameter 기능과 동일)

@RequestParam은 1개의 HTTP 요청 파라미터를 받기 위해서 사용한다.

  • 파라미터 이름으로 바인딩
    /excel/detail?id=1234

@RequestParam은 필수 여부가 true이기 때문에, 반드시 해당 파라미터가 적용되어야 하며, 파라미터가 전송되지 않으면 400에러가 발생한다.
--> 반드시 필요한 값이 아니라면 required를 false로 설정

2. @RequestBody

@RequestBody는 클라이언트가 전송하는 Json(application/json) 형태의 HTTP Body를 객체로 변환시켜주는 역할을 한다.
@RequestBody로 받는 데이터는 Spring에서 관리하는 MessageConverter들 중 하나인 MappingJackson2HttpMessageConverter를 통해 Java객체로 변환.

3. @ModelAttribute

( -> Spring Model 객체에 모델 속성을 추가하거나, Model 객체에서 속성을 얻을 때 사용하는 에너테이션)

1. 메서드에 @ModelAttribute적용

Model 객체에 속성을 저장하고 싶을 때는 메서드에 @ModelAttribute를 설정한다. 메서드는 하나 이상의 모델 속성을 Model 객체에 추가한다.

  • @ModelAttribute를 설정했으므로 반환받은 uploadExcel 인스턴스가 Model 객체에 추가된다.

  • @ModelAttribute의 name 속성은 반환받은 uploadExcel 객체를 newUploadExcel이라는 이름으로 Model 객체에 저장한다. * model 속성의 스코프가 request스코프일때이며, 이는 요청 처리가 끝나거나 요청을 리다이렉션하면 모델 속성이 사라진다.

  • @ModelAttribute의 name속성을 지정하지 않으면 메서드가 반환하는 객체를 Model 객체에 저장할 때 객체 타입의 이름을 속성이름으로 사용한다.

  • Model 객체에 직접 모델 속성 추가하기

2. 메서드 인수에 @ModelAttribute 적용

( -> HttpServletRequest의 request.setAttribute 기능과 비슷한 역할)

Model 객체에서 속성을 읽고 싶을 때메서드 인수에 @ModelAttribute를 설정한다. Model 객체에서 모델 속성을 읽어 메서드 인수에 대입한다.

@ModelAttribute는 클라이언트가 전송하는 form형태의 HTTP Body와 요청 파라미터들을 생성자나 Setter로 바인딩하기 위해 사용된다.

@ModelAttribute에는 매핑시키는 파라미터의 타입이 객체의 타입과 일치하는지 등을 포함한 다양한 Validation 작업이 추가적으로 진행된다.

0개의 댓글