[쇼핑몰 리팩토링 1] 검색 조건 유지(feat. Object Scope)
1. 문제 상황
쇼핑몰에서 상품을 검색할 때
상품번호, 상품명, 가격을 입력한다.
검색조건에 맞는 상품이 여러개 있을 경우,
당연히 페이지가 나뉘게 된다. (+ 레코드는 3개씩 보여주도록 설정해두었음)
그런데 2페이지를 클릭해 페이지를 요청하면 검색조건이 초기화된다.
2. 문제 원인
그 이유는
검색조건을 가진 searchVO데이터를 request Object Scope에 저장하도록 개발했기 때문이다.
request.setAttribute("searchVO", searchVO);
return "forward:/product/ListProduct.jsp";
검색조건 파라미터가 있는 경우에는('검색'버튼을 클릭으로 req하여 form을 submit해 request)
searchVO의 모든 필드(페이지, 페이지유닛, 검색조건, 검색키워드)를 그 순간에 모두 세팅하므로 null값이 없다.
이렇게 세팅된 searchVO는 forward를 통해 jsp페이지로 넘어가기때문에, Request Object Scope에 저장했던 searchVO도 잘 넘어가서 DAO를 거쳐 상품목록을 조회할 수 있다.
그러나 파라미터가 없는 경우에는(페이지 번호1,2,3...클릭을 통한 request )
searchVO의 필드 중 post방식으로 전달 되는 (검색조건, 검색키워드)필드는 null이 된다.
Request방식에 따라 조건설정이 가능할 수도/않을 수도 있는 코딩이므로 견고하지 않았던 것이다.
3. 해결 방법 (Object Scope을 Request->Session으로 변경)
lifecycle이 하나의Request인 Request Object Scope대신에
하나의 Session단위로 저장해서, (브라우저 세션은 setMaxAge(-1)로서, 브라우저 끄기 전까지 유지됨)
Session이 있는 동안은 검색조건을 유지하고 수정할 수 있는
Session Object Scope에 searchVO를 attribute로 저장하기로 수정했다.
//세션 자체는 로그인할때 만드므로 있을 것임. 그러므로 새로 생성x
//getSession(true)가 default. 이미 존재하는 세션을 session에 저장할 것이다.
HttpSession session = request.getSession();
//세션은 있었어도 세션 안에 searchVO라는 attribute가 없을순 있어서, 없으면 생성.
if(session.getAttribute("searchVO") == null) {
session.setAttribute("searchVO", new SearchVO());
System.out.println("searchVO Attribute 생성.");
}
SearchVO searchVO = (SearchVO)session.getAttribute("searchVO");
먼저, 처음 검색을 할 때 searchVO라는 attribute를 session에 저장한다.
//검색조건, 키워드 설정
if(request.getParameter("searchCondition")!=null ) {
searchVO.setSearchCondition(request.getParameter("searchCondition"));
}
if(request.getParameter("searchKeyword")!= null ) {
searchVO.setSearchKeyword(request.getParameter("searchKeyword"));
}
//DAO에게 일 넘기기
ProductService service=new ProductServiceImpl();
HashMap<String,Object> map=service.getProductList(searchVO);
request.setAttribute("map", map);
//request.setAttribute("searchVO", searchVO);
session.setAttribute("searchVO", searchVO);
return "forward:/product/ListProduct.jsp";
앞서 언급한대로, 파라미터가 있는경우/없는 경우를 판단한다.
파라미터가 없다면 검색조건유지,
파라미터가 있다면 검색조건을 바꿔서 검색버튼을 클릭했을수도 있으므로 set해줬다.
!! 결과