먼저 뷰는 위 그림과 같이 간단합니다. 기본값을 설정해서 바로 검색 버튼 눌러서 검색할 수 있도록 해뒀습니다.

기본 값은 다음과 같습니다.

현재일 까지 세 달치 검색, 검색어가 없으면 모두 검색. 있으면 해당 키워드가 있는 제목 또는 본문을 가진 글 검색.

작성일 검색 조건 바뀔 때마다 달력으로 검색 범위를 표현해주면 좋겠는데.. 그런 멋진 UI는 나~~~~중에.. 해보기로 하구요. 일단 저렇게 해놨습니다.

<h1>${board.name} 게시판 검색</h1>
<form:form commandName="param" action="/post/list.do">
    검색어 <form:input path="keyword"/>
    <form:checkboxes items="${ref.fieldNames}" path="fieldNames" /><br/>
    작성일: <form:input path="basicDate"/>
    <form:select path="dateSearchingType" items="${ref.dateSearchingTypes}" />
    <form:select path="dateSearchingTerm" items="${ref.dateSearchingTerms}" /><br/>
    <input type="submit" value="검색"/>
</form:form>

뷰 핵심 코드는 스프링 form 태그를 이용해서 간단하게~ 샤샥...

저 화면을 보여주는 컨트롤러 코드는

    @RequestMapping
    public void search(int boardId, ModelMap model){
        model.addAttribute("param", new PostSearchParam());
        model.addAttribute(boardService.getById(boardId));
    }

참 쉽죠?

저 화면의 폼 처리를 하는 컨트롤러 코드는

    @RequestMapping
    public void list(@ModelAttribute("param")PostSearchParam param, ModelMap model){
        System.out.println(param.getKeyword());
        System.out.println(Arrays.toString(param.getFieldNames()));
        System.out.println(param.getBasicDate());
        System.out.println(param.getDateSearchingTerm().name());
        System.out.println(param.getDateSearchingType().name());
//        model.addAttribute(postService.list(param));
    }

요거.. 전 아직도 sysout 디버깅이 넘 좋아요.ㅋㅋ 일단 잘 받는 것 까지 해야 그 다음으로 DAO에서 검색해서 가져오고. 어쩌구 저쩌구를 구현해야 하는데 여기서 한 번 끊고 가는거죠. DAO쪽에선 검색 조건 테스트 할 께 많을테니까요. 짧은 단위로 개발하기..

자.. 저 정도 코드면 될까요? 안 돼죠. 저 녀석들이 주연이면 조연이 필요합니다.

public enum DateSearchingTerm {

    ONE(1, "한 달"), TWO(2, "두 달"), THREE(3, "세 달"), ALL(0, "모두");

    private int duration;

    private String description;

    DateSearchingTerm(int duration, String description) {
        this.duration = duration;
        this.description = description;
    }

    public int getDuration() {
        return duration;
    }

    public String getDescription() {
        return description;
    }

    public String toString() {
        return description;
    }
}

이 녀석은 작성일 검색 기간 enum으로 duraion은 나중에 DAO에서 검색 조건 만들 때 사용할 속성입니다. 약간 미리 예상하고 만들어 둔 속성이라 거시기 한데... 뭐 필요없어지면 지워버리죠. 하나를 봤으니 딴 건 안 보겠습니다.

public class DateSearchingTermPropertyEditor extends PropertyEditorSupport {

    @Override
    public String getAsText() {
        Object value = getValue();
        if(value == null)
            return "";
        else
            return value.toString();
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if(text.equals("한 달"))
            setValue(DateSearchingTerm.ONE);
        if(text.equals("두 달"))
            setValue(DateSearchingTerm.TWO);
        if(text.equals("세 달"))
            setValue(DateSearchingTerm.THREE);
        if(text.equals("모두"))
            setValue(DateSearchingTerm.ALL);
    }

}

이 녀석은 프로퍼티 에디터 나중에 폼 처리하는 메소드에서 바인딩 할 때 모르는 타입이라고 에러가 날 겁니다. 그래서 이 녀석을 등록해줘야 하죠,

등록은 컨트롤러에서..

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);

        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
        binder.registerCustomEditor(DateSearchingTerm.class, new DateSearchingTermPropertyEditor());
        binder.registerCustomEditor(DateSearchingType.class, new DateSearchingTypePropertyEditor());
    }

이렇게 해도 되고 쟤들은 다른 컨트롤러도 사용할 테니까 나중에 글로벌하게 XML에 다음의 코드를 이용해서 등록해도 되겠죠

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="cacheSeconds" value="0" />
    <property name="webBindingInitializer">
        <bean class="org.springframework.samples.petclinic.web.ClinicBindingInitializer" />
    </property>
</bean>

from 스프링 레퍼런스 13장

쪼아.. 이제 DAO 구현하러 ㄱㄱㄱ...