[Spring Framework] @RequestParam을 사용하여 List형 데이터 받을때 주의점

Published on: 2013. 11. 14. 14:11 by louis.dev
html페이지로부터 전달되는 파라미터를 받아올때 @RequestParam 어노테이션을 사용해서 httpServletRequest 를 사용하지 않고도 데이터를 전달 받을 수 있다. 만약 페이지에서 name 속성을 동일하게 주어지면 @RequestParam을 이용해서 List형태로 받는것도 가능하다.
<form action="/submit" method="get">
	name=value1 <input type="text" name="value1" />
	name=value1 <input type="text" name="value1" />
	<input type="submit" value="submit" />
</form>
이렇게 textbox를 동일한 이름으로 submit을 하게 되면 파라미터는
value1=1111&value1=2222
처럼 동일한 파라미터 명을 가지게 되고 이 값을 스프링의 Controller에서 List형태로 받으려면
@RequestMapping("/submit")
public String submit(@RequestParam(value="value1", required=true) List<String> values) {
	System.out.println(values.size());  //2가 나오는것을 볼수 있다.
	return null;
}
처럼 사용할수 있다. 그런데 @RequestParam은 ,(comma)형태로 데이터를 보내게되도 ,(comma)를 구분자로하여 데이터를 쪼개서 List형태로 데이터를 변환한다.
//전달된 파라미터가 value1=111,222,333,444 형태라면
@RequestMapping("/submit")
public String submit(@RequestParam(value="value1", required=true) List<String> values) {
	for(String value : values) {
		System.out.println(value);    
	}
	//출력결과는 
	//111
	//222
	//333
	//444
	return null;
}
만약 html 뷰 페이지에서 다음과 같이 추가 버튼을 눌러 동적으로 입력 폼을 추가 하게되게끔 개발을 했다고 하면
<form action="/submit" method="get">
	name=value1 <input type="text" name="value1"/><button type="button" onclick="textbox추가 로직">추가</button>
	<input type="submit" value="submit" />
</form>
Controller에서는 몇개의 textbox가 추가가 될지 모르니 위와같이 @RequestParam을 이용해서 List형태로 받게 될것이다. 이때 textbox가 1개이고(추가버튼을 누르지 않고) 입력된 데이터가 ,(comma)로 구분되는 문자가 들어오게 된다면 우리는 의도했던것과는 다르게 사이즈가 1개이상인(콤마갯수 + 1개) List를 돌려받게 될것이다. 위와같은 문제가 발생될 소지가 있다면 어쩔수 없이 httpServletRequest의 getParameterValues 메소드를 사용하여 직접 받을 수 밖에 없으니 comma에 주의해서 @RequestParam 어노테이션을 사용하자.