ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [쇼핑몰 리팩토링 1] 검색 조건 유지(feat. Object Scope)
    카테고리 없음 2024. 2. 17. 12:45

     

    1. 문제 상황

     

    쇼핑몰에서 상품을 검색할 때

    상품번호, 상품명, 가격을 입력한다.

    검색조건에 맞는 상품이 여러개 있을 경우,

    당연히 페이지가 나뉘게 된다. (+ 레코드는 3개씩 보여주도록 설정해두었음)

    2페이지까지 자전거가 있다.

    그런데 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해줬다.

     


    !! 결과

    페이지 번호클릭을 통한 req에도 검색조건 유지한 모습!

     

Designed by Tistory.