[Spring] @RequestBody @RequestParam @ModelAttribute

Jisoo Choi·2022년 1월 21일
0

Spring Framework

목록 보기
2/2

Client에서 받은 요청을 Controller에서 데이터를 인자에 할당하는 방법들이다.
- @RequestBody
- @RequestParam
- @ModelAttribute

[@RequestParam]

  • 1개의 HTTP 요청 파라미터를 받기 위해서 사용한다.
  • 데이터를 받을 때는 데이터를 저장하는 이름으로 매개변수명을 설정해주어야한다.
  • 필수 여부(required)가 true이므로 기본적으로 반드시 해당 파라미터가 전송되어야 한다.
    • 전송되지 않으면 http status code ‘400’ 에러 발생!
    • 필수값을 false로 설정할 수 있다.
@Controller
public class TestController {

        @PostMapping("/receive")
	public String age((@RequestParam(value = "error", required = false) String req) {
		System.out.println("통신 성공");
		System.out.println(">>> " + req);
		return "result";
	}
}

[@RequestBody]

  • 클라이언트가 전송하는 Json(application/json) 형태의 HTTP Body내용을 Java Object로 변환시켜주는 역할.
    • Body가 존재하지 않는 GET메소드에 해당 어노테이션을 활용하려면 에러 발생!
  • @RequestBody로 받는 데이터는 스프링에서 관리하는 MessageConverter들 중 하나인 Mapping_Jackson2HttpMessageConverter를 통해 Java 객체로 변환된다.
  • RequestParam처럼 매개변수로 받을 수 있고, Object로 받을 수도 있다.
@Controller
public class TestController  {

	@PostMapping("/receive")
	public String age(@RequestBody Person person) {
		System.out.println("통신 성공");
		System.out.println("Person 데이터 >>> " + person);
		return "result";
	}
}

@RequestBody 와 @RequestParam

👀 둘다 Map<String, String>으로 결과를 받아올 수 있다.

 @Controller
public class TestController {

	@PostMapping("/receive")
	public String age(@RequestBody Map<String,String> map) {
		System.out.println("통신 성공");
		System.out.println(">>> " + map.get("name"));
		System.out.println(">>> " + map.get("age"));
		return "result";
	}
}

[@ModelAttribute]

  • 클라이언트가 전송하는 multipart/form-data 형태의 HTTP Body내용과 HTTP 파라미터의 값들을 생성자나 Setter 를 통해 주입하기 위해 사용된다.
  • 해당 어노테이션에는 매핑시키는 파라미터의 타입이 객체의 타입과 일치하는지를 포함한 다양한 검증(Validation)작업이 추가적으로 진행된다.
 @Controller
public class TestController {

	@PostMapping("/modelAttribute") 
	public ResponseEntity<Board> modelAttribute(@ModelAttribute final Board board) { 
	// @ModelAttribute는 multipart/form-data 형태의 HTTP Body 내용과 HTTP 파라미터들을 1대1로 객체에 바인딩시킨다. 
  	// 만약 값을 주입해주는 생성자나 Setter함수가 없다면 매핑을 시키지 못하고, null을 갖게 된다. 
  
  	log.info(board); 
        return ResponseEntity.ok(board); 
        
}

@RequestBody 와 @ModelAttribute

  • @ModelAttribute는 바인딩하는 값들을 주입해주는 생서아나 Setter가 없으면 매핑되지 않는다!!
  • 반면, @RequestBody는 요청받은 데이터를 변환시키는 것이기 떄문에 생성자나 Setter함수가 없어도 값이 매핑된다.
💡 @RequestBody → Json이나 XML과 같은 형태의 데이터를 MessageConverter를 통해 변환시킴.

💡 @ModelAttribute → multipart/form-data형태의 HTTP Body와 HTTP파라미터들을 생성자나 수정자로 주입시킴.



Reference

profile
👩‍🚀 No worries! Just record

0개의 댓글