보통 Web 개발 하면 Spring 이 자연스럽게 떠오른다. 그 만큼 보편화 되어 있다. 개발 경험이 있다면 @ModelAttribute 라는 어노테이션이 친숙할 것 이다. 아래 그림을 보자.
Spring 을 사용하면 대표적으로 떠오르는 Servlet 이 있다. Servlet 를 직접 개발 하면 HttpServletRequest.getParameter(String name) 을 직접 사용하지만, DispatcherServlet 는 name 값과 Model Class 의 field 가 mapping 되어 값을 넣어준다. 그 시점은 Controller 호출 되기 직전 이라고 보면 된다. 참 편리한 기능 이다.
여기서 한번 더 생각 해보자. List 로 받을 수는 없을 까? 여러 번의 시도 끝에 방법을 찾았다.
@RequestMapping(value="/sample", method=RequestMethod.POST)
public ModelAndView sample(List<Sample> sampleList) throws Exception {
try {
ModelAndView mav = new ModelAndView();
// Doing...
return mav;
} catch (Exception e) {
throw e;
}
}
Controller 소스 중 일부 이다. @ModelAttribute 는 생략이 가능 한 어노테이션 이다. 방금 설명 했던 mapping 작업은 Object 기준으로 이루어 진다. 결국 위 소스는 무용지물 이다. 다른 방법으로 접근 해 보자.
public class Sample {
private String sample1;
private String sample2;
private String sample3;
private String files;
private List<Sample> sampleList;
// Doing...
}
Model Class 에 List 로 선언 하면 mapping 이 가능하다.
<table class="sample_table" border="0" cellspacing="0" summary="">
<tr>
<th scope="row">Sample 1</th>
<td class="long">
<input type="text" name="sampleList[index].sample1" />
</td>
</tr>
<tr>
<th scope="row">Sample 2</th>
<td class="long">
<input type="text" name="sampleList[index].sample2" />
</td>
</tr>
<tr>
<th scope="row">Sample 3</th>
<td>
<input type="text" name="sampleList[index].sample3" />
</td>
</tr>
<tr>
<th scope="row">Sample File</th>
<td class="long">
<input type="file" name="sampleList[index].files" />
</td>
</tr>
</table>
값은 전달 하는 Html 이다. name 을 주시 하자. Model Class 에서 선언 했던 List 값과 동일 하다. 배열을 사용하듯 name 값을 작성 한다.
@RequestMapping(value="/sample", method=RequestMethod.POST)
public ModelAndView sample(Sample sample) throws Exception {
try {
ModelAndView mav = new ModelAndView();
logger.debug(sample.toString());
// Doing...
return mav;
} catch (Exception e) {
throw e;
}
}
실제 요청을 받아 보자. log 을 보면 값을 확인 할 수 있을 것 이고, 이로서 흔히 게시글 N개 를 동시에 등록할 때 사용하면 편리하게 처리가 가능 하다.
참고 사이트