요청의 파라미터를 연결할 때 매개변수에 붙이는 annotation
@Controller
public class Example{
@RequestMapping("/func")
public void func(String year){
//todo
}
}
위 예시는 request의 매개변수로 String형 변수 year를 넘겨받는다.
요청하는 URL에 따른 year값은 아래와 같다.
/requestParam ---->> year=null
/requestParam?year= ---->> year=""
/requestParam?year ---->> year=""
지금은 year값을 아예 넘기지 않아도 오류는 발생하지 않는다. 그 이유는 year가 String형이기 때문인데, String을 int로 변경하면 오류가 발생한다.

500번대 오류인 이유는 서버측이 year변수를 필수적으로 입력하라고 하지 않았기 때문이다.
RequestParam을 이용하여 필수 입력으로 선언할 수 있다.
public String main3(@RequestParam(name="year",
required=true) String year) { // 아래와 동일
public String main3(@RequestParam String year) {
위처럼 RequestParam을 이용하면 year값을 넘기지 않은 경우 400번대 오류를 발생시킨다.

필수 입력으로 넘기는 값이 아니면 default 값을 선언하는게 좋다.
public String main11(@RequestParam(required=false,
defaultValue="1") int year) {
위 처럼 선언하면, year값을 넘기지 않아도 오류가 발생하지 않는다.
서버단의 문제가 아니더라도, 오류 페이지를 날 것 그대로 보여주는 것은 별로 좋지 않다.
ExceptionHandler를 이용하여, 오류가 발생했을 때, 브라우저에 보여줄 view로 연결해주는게 보기 좋다.
@ExceptionHandler(Exception.class)
public String catcher(Exception ex) {
return "error";
}
적용 대상을 Model의 속성으로 자동 추가해주는 annotation.
반환 타입 또는 controller 메서드의 매개변수에 적용 가능
@RequestMapping("/getYoil")
public String main(MyDate date,Model model) {
if(!isValid(date)) {
return "yoilError";
}
char yoil = getYoil(date);
model.addAttribute("myDate",date);
model.addAttribute("yoil",yoil);
return "yoil";
}
main 메서드에서 처리한 결과를 Model 객체의 attribute으로 추가함으로써, 정보를 넘겨줄 수 있는데, @ModelAttribute를 이용하면
model.addAttribute()를 사용하지 않아도, spring이 알아서 추가해준다.
@RequestMapping("/getYoil")
public String main(@ModelAttribute MyDate date,Model model) {
if(!isValid(date)) {
return "yoilError";
}
return "yoil";
}
ModelAttribute를 사용하면 훨씬 간결한 코드를 구현할 수 있다.
연산을 담당하는 메서드를 호출하는 코드가 없어도, 똑같은 결과를 보여준다.
date처럼 참조형 매개변수인 경우는 ModelAttribute를 생략해도 결과는 동일하다.
private @ModelAttribute("yoil") char getYoil(MyDate date) {
return getYoil(date.getYear(),date.getMonth(),date.getDay());
}
그 이유는 메서드의 반환타입에 ModelAttribute를 적용했기 때문이다.
컨트롤러 매개변수에는 2가지 종류가 있다.
참조형 매개변수일 때는 RequestParam을 적용할 수 없다.
여러 변수들이 바인딩되기 때문
기본형 매개변수일 때는 ModelAttribute를 적용할 필요가 없다.
변수를 model에 저장할 필요가 없고, view에서 ${param.파라미터}로 바로 접근 가능하기 때문