Spring

request.setAttribute, model.addAttribute, ModelAndView

shika 2022. 1. 22. 14:00

스프링에서 정보를 전달할때 크게 4가지 방식이 있다.

 

코드로 살펴보자

Controller의 코드다.

@Controller
public class TestControlelr { //4개의 방식으로 정보전달 가능
	@GetMapping("/test1")
	public String test1() {  //파라미터로 정보를 넘기는 경우 test1.jsp에서 ${param. } 으로 출력이 가능하다
		return "test1";
	}

	@GetMapping("/test2")
	public String test2(HttpServletRequest request) {

		request.setAttribute("data1", 100);//HttpServletRequest로 정보전달 방식, jsp에서 ${data1}로 출력가능
		request.setAttribute("data2", 200);
		return "test2";
	}

	@GetMapping("/test3")
	public String test3(Model model) {   //Model을 이용한 정보전달(4개 다 비슷하지만 이게 가장 편한듯?)

		model.addAttribute("data1", 300); //model을 통해서 정보를 전달하고 jsp에서 ${data1}로 출력 가능
		model.addAttribute("data2", 400);
		return "test3";
	}
	
	@GetMapping("/test4")
	public ModelAndView test4(ModelAndView mv) { //ModelAndView방식 리턴값이 ModelAndView이고 파라미터에서 객체를 만들어 사용
		mv.addObject("data1", 500); //만들어논 객체어 data1을 삽입
		mv.addObject("data2", 600);
		
		mv.setViewName("test4"); //setViewName 메소드를 사용해서 view의 이름을 정해주고 
		return mv;       		 // 객체를 리턴해준다
	}
}

이렇게 하고 

test1 ,2 ,3 jsp를 살펴보자 순서대로 써보겠다

test1.jsp

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>test1</h1>
	<h3>data1 : ${param.data1}</h3> <!-- param. 은 파라미터를 뜻함 (저거 안붙이고 그냥 data1만 치면 아무것도 안뜬다) -->
	<h3>data2 : ${param.data2}</h3>
	<h3>data2 : ${data2}</h3>  <!-- 위에줄과 다른결과! 이건 출력안됨 결과값 -> data2 :  만 뜬다 파라미터는 앞에 param. 을 추가하자 -->
</body>
</html>

test2.jsp

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>test2</h1>
	<h3>${requestScope.data1 }</h3>
	<h3>${requestScope.data2 }</h3> <!-- requestScope는 생략가능 -->
	<h3>${data2 }</h3> 				<!-- 위에줄과 동일함(but 유지보수할때 편하려면 붙히는것도 좋다)  -->
</body>
</html>

test3.jsp

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>test3</h1>
	<h3>${requestScope.data1 }</h3>
	<h3>${requestScope.data2 }</h3>
	<%--  <h3>${data2 }</h3> 위와 동일--%>
</body>
</html>

다 정상적으로 출력가능한것을 확인할 수 있다.

 

중요한것은 다 requestScope의 영역이라는 것이다.

HttpServletRequest request 는 당연히 request영역이고

Model 또한 request 영역에 존재한다

때문에 jsp에서

${requestScope.data2 } 이렇게 해도 출력이 되는것이다

물론 ${data2 } 이렇게해도 출력이 가능하고 더 간편하다.

단점이라면 앞에 영역을 명시해주지 않는다면

많은 영역이 있는 코드라면 헷갈릴 수 있다는 점이다.

 

붙이고 안붙이고는 취향차이? 라고 들었기때문에

편한대로 써주면 된다.

 

하 test1.jsp은

<body>
	<a href="test1?data1=100&data2=200">test1</a><br>
	<hr>
	<a href="test2">test2</a><br>
	<hr>
	<a href="test3">test3</a><br>
	<hr>
	<a href="test4">test4</a><br>
	<hr>
	<hr>
</body>

이렇게 보내주었기 때문에

${param.data1}이 가능한 것이다.

${requestScope.data1 } 얘는 ${data1 } 이렇게 써도 출력이 잘 되는 반면

param은

${param.data1 } 이렇게 써야만 출력이 가능하다

${data1 } 그냥 이렇게 쓰면 출력이 안되고 그냥 빈값으로 나오게 된다!

param으로 넘어오는 것은 꼭 범위를 지정해주는

${param. }을 써주도록 하자