[Spring] Model과 RedirectAttributes에 대해서...

username-bb·2021년 11월 25일
0

목차

  1. Model의 .addAttribute로 parameter를 넘겨서 redirect 했을 경우
  2. RedirectAttributes의 .addFlashAttribute로 parameter를 넘겨서 redirect 했을 경우
  3. RedirectAttributes의 .addAttribute로 parameter를 넘겨서 redirect 했을 경우
  4. 그래서 이 친구들의 차이점은요...
  5. 도움을 주신 훌륭한 블로그...

처음 Model을 배웠을 때 Model은 Redirect된 Parameter를 전달할 수 없다고 배웠는데.... 아니었던 것 같다. 왜 아니다! 가 아니라 아니었던 것 같다냐면... Parameter 전달이 됐다가 안됐다가 하기 때문이다. 왠지는 아직 발견하지 못했다. 암튼... 이것을 기회로 Model과 RedirectAttributes에 대해서 공부해보기로 했다.

1. Model의 .addAttribute로 parameter를 넘겨서 redirect 했을 경우


  1. Parameter를 보내는 쪽에서는 .addAttribute로 값을 setting해서 다른 method로 parameter를 전달해주고

  2. Parameter를 받는 쪽에서는 parameter를 받을 때 어노테이션을 명시해주고

  3. 받은 parameter를 .addAttribute로 값을 setting해줘야 최종적으로 view에 전달이 된다.

  4. 단, 전달된 Parameter는 GET방식으로 URL에 나타난다.


  • 게시판 Controller
//	커뮤니티 리스트 페이지 요청
	@RequestMapping("list.cm")
	public String getCommuList(Model model, @RequestParam(value="statVal", defaultValue = "1") int statVal,
								@RequestParam(value="currentPage", defaultValue = "1") int currentPage) throws Exception{
		
		// int currentPage = 현재 페이지 위치
		// main page에서 넘어왔을 경우 1임.
		
		
		//전체 데이터 갯수 확인
		int total = communityService.countTotal();
		
		
		//한 페이지에 게시글 10개씩, 하단의 페이징은 5개까지 한다.
		PageInfo pageInfo = Pagination.getPageInfo(total, currentPage, 5, 10);

		
		//페이징에 맞춰서 게시글 리스트를 가져온다
		List<Community> list = communityService.getCommunityList(pageInfo);

		
		//게시글 리스트와 페이지 관련 정보 전달
		model.addAttribute("commuList", list);
		model.addAttribute("pageInfo", pageInfo);
		model.addAttribute("statVal", statVal);
		
		return "/community/commuList";
	}


//	커뮤니티 게시글 상세보기 페이지 요청
	@RequestMapping("contentView.cm")
	public String getCommuContent(Model model, 
								  @RequestParam(value="comNo", defaultValue="0") int comNo) throws Exception{
		
		//RedirectAttributes redirectAttribute,
		
		//comNo가 default value일 때 alert을 띄워주기 위한 코드
		//list로 돌아가서 alert을 띄워준다.
		if(comNo == 0) {
			model.addAttribute("statVal", 4);
			return "redirect:list.cm";
		}
		
		//게시글 조회수 증가
		communityService.increaseCommunity(comNo);
		
		//게시글 세부 내역 가져오기
		Community community = communityService.getCommunity(comNo);
		
		//게시글에 딸린 리플 리스트 가져오기
		List<CommunityReply> replyList = replyService.getReplyList(comNo);
		
		model.addAttribute("community", community);
		model.addAttribute("replyList", replyList);
		
		return "/community/commuContentView";
	}

  • URL에 표기된 Parameter


2. RedirectAttributes의 .addFlashAttribute로 parameter를 넘겨서 redirect 했을 경우


  1. Parameter를 보내는 쪽에서는 .addFlashAttribute로 값을 setting해서 다른 method로 parameter를 전달해준다.

  2. Parameter를 받는 쪽에선 별다른 mapping 작업이나 .addAttribute setting 없이 바로 사용할 수 있다.
    (세션을 이용하기 때문. 단, 1회용이기 때문에 redirect 되면 사라진다.)

  3. 이렇게 전달된 Parameter는 URL에 노출되지 않는다.


(참고) .addFlashAttribute 에 대해서...

이 친구는 parameter를 session을 통해 전달한다고 한다.

근데 session처럼 계속 parameter를 가지고 있는 건 아니고... 1회성으로 parameter를 전달하기 위해 사용한다고 한다.

그래서 한 번 redirect된 뒤엔 없어진다고...

refresh 했을 때 parameter 가 언제까지 유지되는지 check하는 게 중요할 수 있겠다!


  • 게시판 Controller
//	커뮤니티 리스트 페이지 요청
	@RequestMapping("list.cm")
	public String getCommuList(Model model, @RequestParam(value="currentPage", defaultValue = "1") int currentPage) throws Exception{
		
		// int currentPage = 현재 페이지 위치
		// main page에서 넘어왔을 경우 1임.
		
		//전체 데이터 갯수 확인
		int total = communityService.countTotal();
		
		
		//한 페이지에 게시글 10개씩, 하단의 페이징은 5개까지 한다.
		PageInfo pageInfo = Pagination.getPageInfo(total, currentPage, 5, 10);

		
		//페이징에 맞춰서 게시글 리스트를 가져온다
		List<Community> list = communityService.getCommunityList(pageInfo);

		
		//게시글 리스트와 페이지 관련 정보 전달
		model.addAttribute("commuList", list);
		model.addAttribute("pageInfo", pageInfo);
		
		return "/community/commuList";
	}

//	커뮤니티 게시글 상세보기 페이지 요청
	@RequestMapping("contentView.cm")
	public String getCommuContent(Model model, RedirectAttributes redirectAttribute,
								  @RequestParam(value="comNo", defaultValue="0") int comNo) throws Exception{
		
	
		//comNo가 default value일 때 alert을 띄워주기 위한 코드
		//list로 돌아가서 alert을 띄워준다.
		if(comNo == 0) {
			redirectAttribute.addFlashAttribute("statVal", 4);
			return "redirect:list.cm";
		}
		
		//게시글 조회수 증가
		communityService.increaseCommunity(comNo);
		
		//게시글 세부 내역 가져오기
		Community community = communityService.getCommunity(comNo);
		
		//게시글에 딸린 리플 리스트 가져오기
		List<CommunityReply> replyList = replyService.getReplyList(comNo);
		
		model.addAttribute("community", community);
		model.addAttribute("replyList", replyList);
		
		return "/community/commuContentView";
	}

  • URL에 표기되지 않은 Parameter



3. RedirectAttributes의 .addAttribute로 parameter를 넘겨서 redirect 했을 경우


이때는 Model의 .addAttribute를 사용한 것과 동일하게 동작한다.
(URL에 전달된 Parameter가 노출이 된다.)
특이한 사항은... Model 이 Redirect된 Parameter를 전달하지 못할 때 RedirectAttributes는 전달했다. 방식은 비슷해도 내부적으로 차이가 있긴 한 것 같은데... 명확하게 알아내진 못했다.




4. 그래서 이 친구들의 차이점은요...


  1. 전달된 parameter가 URL에 노출되는가?
  2. method 간에 parameter를 전달할 때, parameter를 받는 쪽에서는 어떻게 parameter를 받아야하는가?


5. 도움을 주신 훌륭한 블로그...


  1. https://m.blog.naver.com/allkanet72/220964699929
  2. https://bactoria.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-addAttribute-addFlashAttribute-%EC%B0%A8%EC%9D%B4%EC%A0%90-RedirectAttributes-rttr-%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%ED%8A%B8
  3. https://gdtbgl93.tistory.com/108
  4. https://sendthesignal.tistory.com/entry/Spring-Framework-%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%ED%8A%B8redirect%EC%8B%9C-%EA%B0%92parameter-%EC%A0%84%EB%8B%AC
profile
공부하는 주니어

0개의 댓글