[회사일] 검색에 enum 필드 추가하기
검색 파라미터에 추가해주고 화면에 추가하고 DAO에서 검색부분 코드만 조금 바꾸면 될 것 같습니다.
코드 검색 파라미터를 하나의 클래스로 정의해놨기에 망정이지 이걸 개별적으로 다 핸들러 파라미터로 받아서 처리하면;;; @_@;; 컨트롤러 코드도 손대야 했을껍니다. 아마 서비스 코드도 마찬가지구요.
public class CodeSearchParam {
private int cateValue;
private String name;
private String code;
...
}
이렇게 CodeCate의 값을 바로 가져옵니다. 스프링 바인딩 사용해서 CodeCate 타입으로 받아도 되지만 굳이 그럴필요가 없더군요. 어차피 DB에 들어있는 값과 비교하려면 CodeCate의 value가 필요하며 화면에서도 이걸 전달해 주는데 굳이 이걸 또 포매터 사용해서 CodeCate로 바꿔서 거기서 .getValue()로 꺼내서 비교할 필요가 있나 싶더라구요. 그래서 그냥 int 타입인 cateValue를 선언했습니다.
이제 화면코드로 넘어갑니다.
<p class="ui-widget-content"><label>코드종류: </label>
<form:select path="cateValue">
<form:option value="0" label="ALL"/>
<form:options items="${ref.codeCateList}" itemLabel="descr" itemValue="value"/>
</form:select>
</p>
아무것도 선택하지 않았을 때 기본으로 ALL이 보일테고 그걸 선택하면 0이라는 값이 넘어가게 합니다. 뭐 이부분은 맘대로인것 같은데 그닦 맘에 들진 않아도 뭐 어쩔 수 있나요. 모든 enum마다 ALL 이라는 값을 만들기도 뭐하고.. 걍 이대로가 나은것 같습니다.
DAO에서 검색 파라메터를 적용하는 부분에 코드를 추가합니다.
private void applySearchParam(Criteria c, CodeSearchParam searchParam) {
CriteriaUtils.addOptionalLike(c, "code", searchParam.getCode());
CriteriaUtils.addOptionalLike(c, "name", searchParam.getName());
CriteriaUtils.addOptionalEqual(c, "cate", searchParam.getCateValue());
}
CriteriaUtils에 메서드를 하나 추가해 줍니다.
public static void addOptionalEqual(Criteria c, String fieldName, Integer value) {
if(value != null && value != 0){
c.add(Restrictions.eq(fieldName, value));
}
}
끝. 오예 잘 됩니다.
컨트롤러나 서비스 코드는 한줄도 건드리지 않았답니다.
한번 만들어 논 뒤로는 거의 본적이 없으니 어떻게 생겼는지도 기억나지 않는군요.