카테고리 없음

[쇼핑몰 리팩토링 1] 검색 조건 유지(feat. Object Scope)

Yeji Heo 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에도 검색조건 유지한 모습!