@ModelAttribute의 특징

2022. 8. 25. 16:05Spring

728x90

메소드의 파라미터로 사용되는 경우

@ModelAttribute와 @RequestParam의 차이

 

 

@RequestParam

@RequestParam 어노테이션은 사용자가 요청시 전달하는 값을 Controller의 매개변수로 1:1 맵핑할 때 사용되는 어노테이션입니다.

 

public String getHealthBoardList(
	@RequestParam(value = "searchCondition", defaultValue = "TITLE", required = false) String condition,
	@RequestParam(value = "searchKeyword", defaultValue = "", required = false) String keyword,
	HttpServletRequest request, Model model){
		BoardVO vo = new BoardVO();
		System.out.println(boardService);
		List<BoardVO> boardList = boardService.getBoardList(vo);
		model.addAttribute("boardList",boardList);
		return "healthBoardList.jsp";
	}

예를들어, /?searchCondition=TITLE?searchKeyword=헬스 로 요청이 온다면, 위 매개변수인 condition에서 "TITLE", keyword에서 "헬스"가 매핑된다.

 

@ModelAttribute

@ModelAttribute는 사용자가 요청시 전달하는 값을 오브젝트 형태로 매핑해주는 어노테이션입니다.

 

public class BoardVO {
	private int seq;
	private String title;
	private String writer;
	private String content;
	private Date regDate = new Date();
	private int liky;
	private String searchCondition;
	private String searchKeyword;
    ...
    getter
    setter
    }

public String getHealthBoardList(HttpServletRequest request, Model model, @ModelAttribute BoardVO vo){
		List<BoardVO> boardList = boardService.getBoardList(vo);
		model.addAttribute("boardList",boardList);
		return "healthBoardList.jsp";
	}

예를들어, searchCondition, searchKeyword를 인스턴수 변수로 가지는 BoardVO 객체가 존재하고 이를 매개변수로 받기 위해서는 BoardVO 객체에 setter메소드가 존재해야한다.

/?searchCondition=TITLE?searchKeyword=헬스 로 요청이 온다면, 각각의 값이 BoardVO 객체로 바인딩 됩니다.

 

 

메소드단으로 사용될 경우

 

@ModelAttribute는 Controller 클래스에 있는 특정 데이터를 View(.jsp페이지)에서 사용할 수 있도록 사용될 수도 있다.

 

어떤 컨트롤러 클래스 안에 있는 특정 메소드에 @ModelAttriubte 어노테이션이 붙어 잇으면 해당 컨틀롤러 클래스의 모든 @RequestMapping 어노테이션이 붙은 메소드가 호출될 때마다 그 메소드 호출 전에 @ModelAttribute가 붙은 메소드가 일단 먼저 호출되고 그 이후 @RequestMapping이 붙은 메소드가 호출되는 데 이때 @ModelAttribute 메소드 실행 결과로 리턴되는 객체는 자동으로 @RequestMapping 어노테이션이 붙은 메소드의 Model에 저장이되고 그 이후에 view에서 @ModelAttribute 메소드가 반환한 데이터를 사용할 수 있다.

 

@ModelAttribute("conditionMap")
	public Map<String,String> searchConditionMap(){
		Map<String, String> conditionMap = new HashMap<String, String>();
		conditionMap.put("제목", "TITLE");
		conditionMap.put("내용", "CONTENT");
		return conditionMap;
	}
@RequestMapping("/getHealthBoardList.do")
	public String getHealthBoardList(HttpServletRequest request, Model model){
		
		System.out.println("글 목록 검색 처리");
		// 1. 사용자 입력 정보 추출 : 검색 기능은 나중에 구현
		// 2. 데이터베이스 연동 처리
		BoardVO vo = new BoardVO();
		System.out.println(boardService);
		List<BoardVO> boardList = boardService.getBoardList(vo);
		// 3. 응답 화면 구성
		model.addAttribute("boardList",boardList);
		return "healthBoardList.jsp";
	}
<select name="searchCondition">
    <c:forEach items="${conditionMap }" var="option">
        <option value="${option.value }">${option.key }</option>
    </c:forEach>
</select>
    <input type="text" name="searchKeyword" />
    <input type="submit" value="검색" />

 

 

이상입니다!~

728x90