@RequestParam
@RequestParam은 1개의 HTTP 요청 파라미터를 받기 위해서 사용한다.
@RequestParam의 required 속성은 기본값이 true이다.
요청 파라미터의 값이 없다면, 에러가 발생한다.
요청 파라미터가 필수가 아닌 경우에는 required 속성을 false로 한다.
이때는 파라미터의 값이 없다면 에러가 발생하지 않고 null값이 들어간다.
int, long 등 null값이 들어갈 수 없는 변수일 경우도 에러가 난다.
@RequestMapping("/studentView")
@ResponseBody
public String studentView(@RequestParam(required = true) Long id){
//요청에 파라미터가 없으면 에러가 난다.
return "에러";
}
@RequestMapping("/studentView")
@ResponseBody
public String studentView(@RequestParam(required = false) Long id){
System.out.println(id); //파라미터 없이 올 경우 id=null
return null;
}
@RequestMapping("/studentView")
@ResponseBody
public String studentView(@RequestParam(required = false) long id){
System.out.println(id); //primitive 타입인 경우 null값을 할당하지 못해 에러
return null;
}
@RequestBody
@RequestBody는 클라이언트가 전송하는 Json(application/json) 등의 형태의
HTTP Body를 Java 객체로 변환시켜주는 역할을 한다.
@RequestBody로 받는 데이터는 Spring에서 관리하는 MessageConverter들 중 하나인 MappingJackson2HttpMessageConverter를 통해 Java 객체로 변환되는데,
이는 ObjectMapper 라는 클래스를 사용한다.
ObjectMapper는 Json 메세지를 자바 객체로 변환하는 과정에서 객체의
기본 생성자를 통해 객체를 생성하고, 내부적으로 Reflection을 사용한다.
그래서 setter가 없이도 값이 세팅될 수 있다.
StudentDto
@Data
public class StudentDto {
private Long id;
private String name;
private int age;
}
@RequestMapping("/studentRegist")
@ResponseBody
public String studentRegist(@RequestBody StudentDto studentDto){
System.out.println(studentDto);
return null;
}
@RequestBody가 있으면 httpbody에 데이터가 필요하다.
일반적인 http://localhost:8080/studentRegist?id=3&name=chang&age=22 이나
form태그를 이용한 요청(Get,Post 뭐든)은 request에 body가 없어서 에러가 발생한다.
다음과 같은 ajax요청처럼 요청 body에 직접 json데이터가 포함되어 있는 경우에
@Reuqestbody가 동작한다.
let student={"id" : 3 , "name" : "chang" , "age" : 22};
$.ajax({
url : "/studentRegist",
type : "post", //http body를 사용하는거기때문에 post여야만 한다.
data : JSON.stringify(student), //몸체에 직접 json이 들어간다.
// data: student, 이 경우는 일반적인 form으로 요청한것과 같다. 이때는 @RequestBody가 동작X
contentType : "application/json; charset=UTF-8", //따로 요청타입도 지정해줘야함.
success : function(data){
alert("성공");
}
});
@ModelAttribute
@ModelAttribute는 클라이언트가 전송하는 폼(form) 형태의 HTTP Body와
요청 파라미터들을 생성자나 Setter로 바인딩하기 위해 사용된다.
@ModelAttribute는 먼저 생성자를 객체를 생성하고, 생성자에 없는 파라미터인 경우는
setter를 이용해 값을 할당한다.
@RequestMapping("/studentRegist")
@ResponseBody
public String studentRegist(@ModelAttribute StudentDto studentDto){
System.out.println(studentDto);
return null;
}
우리가 일반적으로 사용하는
http://localhost:8080/studentRegist?id=3&name=chang&age=22이나
form태그를 이용한 요청에 값들이 알아서 세팅된다.
참고로 바인딩 된 변수에 @이 붙이지 않으면 @ModelAttribute가 붙은 것처럼 동작한다.