ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] FlashMap으로 페이지 간 값 교환하기
    4.Spring/4.2 업무관련 알게 된 내용 2024. 6. 23. 11:09

    현재 프론트엔드 페이지를 수정해야하는 그치만 상대적으로 간단한..? 프로젝트에 투입이 되었다

    보통은 controller로 사용자에게 보여질 페이지 경로를 입력하면 내가 원하는 경로로 페이지가 보여지게 되는데

    이.. view의 경로가 싹다 바뀌어 컨트롤러 경로를 하나하나 수정하고 백엔드 코드를 건드리는건 너무 비효율적이라고 생각했다.

     

    그래서 내린 결론이 interceptor을 이용하자!

    예를들어

    /test/{페이지아이디} 페이지 요청을 받으면 /test/rest/{페이지아이디}로 리다이트 되게끔 해주어

    리다이렉트 되는 페이지에 기존 모델 값만 전달해주면 됐었다. 하지만 쿼리스트링으로 값 전달은 ㄴㄴ!

     

    1. "/test/1"에 대하여 url 요청시  Controller단

    	@GetMapping(value="/test/1")
    	public String page1(Model model) throws Exception {
        
        //	예를들어 보내려는 message 값이 uuid라고 가정한다면,
    		model.addAttribute("message", UUID.randomUUID().toString());    
            
            return "test/1";
    	}

     

    2. interceptor > postHandle(컨트롤러를 타고 난 뒤 해당 로직 호출)

     

        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler, ModelAndView modelAndView) throws Exception {
        	
        	//	1. 요청 URI를 추출한다.
        	String requestURI = request.getRequestURI();
        			
    			
    	      
    	    //	2. ex ) /test/{페이지아이디} 일 경우 > 페이지 아이디만 만 추출한다
    	     String[] splitURL = requestURI.split("/");
    	     
    	     requestURI = splitURL[splitURL.length-1];
    
    		
    		//	3. ModelAndView 의 model 값이 존재한다면,
    	    if (modelAndView != null && modelAndView.getModel() != null) {
    
    	    	// 3-1. FlashMap(리다이랙트시 URL에 쿼리파라미터로 데이터를 노출시키지 않고, 데이터 전달할때 사용) 객체를 만들어 request 에 생성한다.
    	    	FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);
    	    	
    	    	//3-2. modelAndView 객체 받은 model 값을 추출한다.
    	    	Map<String,Object> modelMap = modelAndView.getModel();
    	    	
    	    	//3-3. modelMap 의 요소를 추출한다.
    	    	for(String key : modelMap.keySet()) {
    	    		
    	    	       log.info(key + " : " + modelMap.get(key));
    	    	       
    	    	       // 3-3-1. 위에서 선언한 flashMap에 model key, value 값 넣는다.
    	               flashMap.put(key, modelMap.get(key));
    	    	}
    	    	
    	    	//4-4. FlashMapManager 위에서 선언한 FlashMap을 서버 어딘가에 저장하게 해주는 FlashMapManager 객체를 선언한다. 
    	    	FlashMapManager flashMapManager = RequestContextUtils.getFlashMapManager(request);
    	    	
    	    	//4-5. FlashMap를 서버 어딘가에 저장한다.
    	    	flashMapManager.saveOutputFlashMap(flashMap, request, response);
    	    
    	    }
    	    	
            // 5. 해당 객체 가지고 test/{pageID} -> /test/rest/{pageID} 로 리다이랙트 시킨다.
            response.sendRedirect("/test/rest/"+requestURI);
    	        }

     

    3. /test/rest/{pageID} 를 받는 컨트롤러 생성

    @RequestMapping("/test/rest")
    @Controller
    public class RestForwardController {
        protected Log log = LogFactory.getLog(this.getClass());
    
        
    	/*-
    	 * Method ID    : redirectToRest
    	 * Method 설명      : interceptor 를 통해서 받은 모델값을 받아서 다른 페이지로 전달 
    	 * @param   requestURI,request, model
    	 * @return  화면페이지 위
    	 */
    	@RequestMapping("/{requestURI}")
    	public String redirectToRest(@PathVariable("requestURI")String requestURI,HttpServletRequest request,Model model) {
    		
    		//1. Interceptor에서 받은 flashMap을 추출한다.
    		Map<String, ?> flashMap = RequestContextUtils.getInputFlashMap(request);
    		
    		//2. 전달받은 model 값이 존재하는 경우, 
    			if(flashMap !=null) {
    				
    				for (Map.Entry<String, ?> entry : flashMap.entrySet()) {
    					
    					//2-1. model 객체에 동적으로 넣어어서 화면에 전달해준다.
    			            model.addAttribute(entry.getKey(), entry.getValue());
    			        }
    			
    			}
    		
    		log.info("페이지 이동 >>  test/rest/"+requestURI);
    		
    		return "test/rest/"+requestURI;
    	}

     

    처음에 gpt 한테 물어봐서 flashMap이라는 존재를 알게 됐었는데

    자꾸 데이터가 저장이 안되어 삽질을 하다가

    결국 구글링을 통해서 

    flashMap을 취급하는 flashMapManager에다가

         flashMapManager.saveOutputFlashMap(flashMap, request, response);

    이걸 꼭 해줘야지 저장이 된다는걸 깨달음..

     

    나같은 주니어개발자는 gpt를 맹신하지말자,,,ㅋㅋㅋ 무조건 의심하고 구글링...하자....

Designed by Tistory.