컨트롤러 매개변수

임정호·2022년 1월 14일
0

Spring공부

목록 보기
4/10

1. @RequestParam

요청의 파라미터를 연결할 때 매개변수에 붙이는 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";
}

2. @ModelAttribute

적용 대상을 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가지 종류가 있다.

  1. RequestParam (기본형 매개변수, String)
  2. ModelAttribute (참조형 매개변수)

참조형 매개변수일 때는 RequestParam을 적용할 수 없다.
여러 변수들이 바인딩되기 때문

기본형 매개변수일 때는 ModelAttribute를 적용할 필요가 없다.
변수를 model에 저장할 필요가 없고, view에서 ${param.파라미터}로 바로 접근 가능하기 때문

0개의 댓글