보통 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개 를 동시에 등록할 때 사용하면 편리하게 처리가 가능 하다.


참고 사이트


+ Recent posts