1. Model이란?

 

Model은 HashMap 형태를 갖고 있으며, key, value값을 가지고 있습니다. 또한 addAttribute()와 같은 기능을 통해 모델에 원하는 속성과 그것에 대한 값을 주어 전달할 뷰에 데이터를 전달할 수 있습니다.

 

Spring에서 Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정할 수 있습니다. Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 하는 존재입니다. 이를 이용해서 JSP와 같은 뷰(View)로 전달해야 하는 데이터를 담아서 보낼 수 있습니다. 메서드의 파라미터에 Model 타입이 지정된 경우에는 스프링은 특별하게 Model 타입의 객체를 만들어서 메서드에 주입하게 됩니다.

 

2. view에 전달해보기

 

package com.mystudy.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class TestController {

	@GetMapping("/test")
	public void testMethod(Model model) {
		
		String test = "model interface";
		
		model.addAttribute("test", test);
	}
}

 

Controller를 생성한 다음 @GetMapper를 통해 url설정을, 메소드에 매개변수를 Model 타입의 model 변수를 선언했습니다. String 타입의 변수 test를 선언하고, model.addAttribute를 통해 view에 데이터를 전달했습니다.

 

<%@ 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>Test</h1>
	
	<h2>${test }</h2>
</body>
</html>

 

해당 test.jsp 파일입니다. 표현식을 통해 전달받은 값을 h2태그에 담았습니다.

 

출력결과입니다. 처음 Controller에 Model 타입의 model의 변수 선언을 통해 addAttribute("test", test)로 나타난 결과값입니다.

 

3. @ModelAttribute

 

@ModelAttribute는 강제로 전달받은 파라미터를 Model에 담아서 전달하도록 할 때 필요한 어노테이션입니다. @ModelAttribute가 걸린 파라미터는 타입에 관계없이 무조건 Model에 담아서 전달되므로, 파라미터로 전달된 데이터를 다시 화면에서 사용해야 할 경우 유용하게 사용됩니다.

 

@GetMapping("/test2")
public String testMethod2(TestVO vo, int number) {

	return "/test2";
}
package com.mystudy.domain;

import lombok.Data;

@Data
public class TestVO {
	private String name;
	private String age;

}
<%@ 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>
	<h2>TestVO : ${testVO }</h2>
	<h2>number : ${number }</h2>
</body>
</html>

 

순서대로 TestVO, Controller, test2.jsp입니다.

 

이번에는 매개변수에 TestVO 클래스의 vo, int 타입의 number를 담았습니다. 그리고 서버를 실행한 다음, 브라우저 에 다음과 같이 입력합니다.

 

그리고 전달 된 클래스 명의 앞글자는 반드시 소문자로 입력해야함을 명심해야합니다.

 

http://localhost:8075/controller/test2?name=hong&age=3&number=3

 

TestVO에 있는 name에는 hong을, age에는 3을 넣고, 그다음 변수인 number에는 같이 3을 입력했습니다. 아래는 결과입니다.

 

 

TestVO에는 입력한 그대로의 값이 나왔지만, number에서는 입력된 값이 출력되지 않았습니다.

이처럼 입력한 값이 그대로 출력이 되지 않을 때 @ModelAttribute를 사용하여 출력을 돕는 방법이 있습니다.

아래는 어노테이션을 붙였을 때 입니다.

 

@GetMapping("/test2")
public String testMethod2(TestVO vo, @ModelAttribute("number") int number) {
	
	return "/test2";
}

 

아까와 다르게 int number 옆에 @ModelAttribute("number")가 붙은 것을 볼 수 있습니다. 이는 강제적으로 url에서 number라는 변수를 Model에 담아서 전달되는 것으로, 파라미터로 전달된 데이터를다시 화면에서 사용하도록 설정했습니다. 

 

http://localhost:8075/controller/test2?name=hong&age=3&number=3

다시 위의 주소를 입력하면,

 

 

 

url에 입력한 number의 값이 화면에 출력되는 모습을 확인할 수 있습니다.

 

 

 

 

 

 

참고자료

memories95.tistory.com/109

책 코드로 배우는 스프링 웹 프로젝트(구멍가게 코딩단 저) book.naver.com/bookdb/book_detail.nhn?bid=9425458

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기