[Spring] @ModelAttribute와 @RequestParam에 대해서...

username-bb·2021년 11월 25일
0

목차

  1. @ModelAttribute와 @RequestParam의 공통점
  2. @ModelAttribute와 @RequestParam의 차이점
  3. 그래서 어디에 어떻게 적용했나요...?
  4. 나름의 결론...
  5. 도움을 주신 훌륭한 블로그...


ModelAttribute로 설정된 Parameter가 할당된 값 없이 Controller로 넘어왔을 때 Exception이 발생한다. 이 Exception을 핸들링하기 위해서 Binding Exception을 해보려고 했으나.... 내 마음대로는 되질 않았고... 그래서 지난번에 포스팅한 ExceptionController를 구현하게 됐다.
암튼... 이걸 계기로 @ModelAttribute와 @RequestParam에 대해서 검색해보기로 했다.

1. @ModelAttribute와 @RequestParam의 공통점


  1. Redirect시에 Parameter를 전달할 수 있다.
    (어노테이션을 명시적으로 써주면 된다! / 어노테이션 종류보다는 parameter를 넘겨주는 측에서 어떻게 넘겨주었느냐가 중요한 것 같다.)

  2. Redirect가 아닐 땐 어노테이션 생략해도 무관하다.
    (Parameter 이름과 일치하면 자동으로 mapping 해줌)


2. @ModelAttribute와 @RequestParam의 차이점


  1. 기본적으로 ModelAttribute는 Parameter를 Object으로 받을 수 있다.
    즉, Parameter를 1:n의 관계로 받을 수 있다는 의미이다.
    (하나의 객체 내부의 여러개의 필드를 한 번에 Mapping함)
    (특히 VO로 받을 땐 Getter, Setter, 생성자가 모두 설정 되어 있어야 한다.)

  2. 기본적으로 RequestParam은 Parameter를 1:1로 Mapping한다.
    때문에 controller로 넘어오는 parameter가 다수일 경우 하나 하나 mapping해줘야 한다.

  3. ModelAttribute는 default value(기본값) 셋팅이 안되지만 RequestParam은 가능하다.


3. 그래서 어디에 어떻게 적용했나요...?


게시판의 currentPage같은 modelAttribute를 requestParam으로 바꿔서 defaultValue를 셋팅해줬다. 그래서 현재 어느 페이지에 있는지에 대한 정보가 없어도 Exception이 발생하지 않는다.

  • 변경 전의 게시판 Controller
//	커뮤니티 리스트 페이지 요청
	@RequestMapping("list.cm")
	public String getCommuList(Model model, @ModelAttribute("currentPage") 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";
	}



  • 변경 후의 게시판 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";
	}


4. 나름의 결론...


default value 설정 없이 ExceptionContoller를 통해 처리하게 할지, 아니면 default value를 설정할지는... 개인의 선택인 것 같다. 이것 외에 다른 방법을 발견할지도 모르고... 암튼... 이것 저것 실험해볼 수 있어서 좋았다.

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


  1. https://galid1.tistory.com/769
  2. https://devcheon.tistory.com/9
profile
공부하는 주니어

0개의 댓글