본문 바로가기

Spring

[Spring] View에 데이터 전송 (Model / ModelAndView)

[해당 포스트는 개인적으로 공부를 하고 차후에 참고용으로 하고자 작성한 것입니다.
따라서 잘못된 부분이나 부족한 부분이 있을 수 있기에 참고하시기 바랍니다.]

Controller는 Business Logic의 결과를 사용자의 View에 전달하기 위해선 특정 저장공간에 담아서 전달해야 한다.

이번엔 Controller에서 View에게 전달하는 방법 2가지에 대해 정리한다.

 

Model

Model은 model attributes를 저장하는 Interface이다. Model에 Attributes를 추가하기 위해 고안되었으며, Java.util.Map으로 모든 Model에 접근을 허용한다.

주로 addAttribute Method를 통해 데이터를 Model에 저장한다.

 

일반적인 사용법은 아래의 예제를 통해 확인하자.

 

@RequestMapping(value="/logic", method=RequestMethod.POST)
	public String testLogic (Model model) {
		
		Logic logic = service.testLogic();
		
		try {
			model.addAttribute("value1", logic.getValue1());
			model.addAttribute("value2", logic.getValue2());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return "Logic";
	}

 

Client가 /logic 경로로 요청이 올 경우 testLogic 이 호출된다. testLogic은 Model을 인자를 받아 Model Interface를 사용할 수 있게 된다. testLogic이라는 Business Logic을 처리한 결과를 logic 변수에 담았다. Business Logic 결과를 Client View에게 전송할 때 사용하는것이 바로 Model이 된다

 

Model의 addAttribute Method를 통해 Key / Value 형태로 값을 임시로 저장한다. Controller는 Model에 데이터를 저장하고 View Name을 Return 하면서 View로 넘어간다. 이때 View는 Model에 저장된 Data를 참고하여 결과를 화면에 출력한다.

 

 

JSP에선 Model에서 지정한 Key를 통해 값을 불러올 수 있다.

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<h1> Logic </h1>
	ID : ${value1}<br/>
	PW : ${value2}<br/>
	
	<a href="/app/resources/html/index.html">Go Main</a>
</body>
</html>

 

ModelAndView

Web MVC Framework에서 Model과 View 둘 다 저장할 수 있다. 

Handler가 Return 한 Model과 View를 나타내며, DispatcherServlet에 의해 분석된다.

View는 ViewResolver 객체에 의해 명시된 String view name를 가져와 사용할 수 있다.

ModelAndView는 Model과 같이 Interface가 아니라 Class로 구현되어있다.

따라서 내부에서 객체를 생성하여 사용한다.

 

@RequestMapping(value="/memLogin", method=RequestMethod.POST)
	public ModelAndView Logic() {
		
		ModelAndView mav = new ModelAndView();
		
		Logic logic = service.memberSearch();
		
		mav.addObject("value1", logic.getValue1());
		mav.addObject("value1", logic.getValue2());
		
		mav.setViewName("Logic");
		
		return mav;
	}

 

위에서 차이점은 Model 객체를 인자로 사용하지 않고 내부에서 ModelAndView 객체를 생성해서 사용한다. 또한 ModelAndView 객체에서 Attribute를 정의하며, 리턴할 View Name까지 모두 정의하였다.

최종 Return은 ModelAndView Type으로 반환된다.