Model
Model은 HashMap 형태를 갖고 있으며, Key,Value값을 가지고 있습니다.
- addAttribute()와 같은 기능을 통해 모델에 원하는 속성과 그것에 대한 값을 주어 전달할 뷰에 데이터를 전달할 수 있습니다.
👉addAttribute는 Map의 put과 같은 기능과 같아서 이를 통해 해당 모델에 원하는 속성과 그것에 대한 값을 주어 전달할 뷰에 데이터를 전달할 수 있습니다. - Spring에서 Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정할 수 있습니다.
- Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 하는 존재입니다.
- 이를 이용해서 JSP와 뷰(View)로 전달해야 하는 데이터를 담아서 보낼 수 있습니다.
- 메서드 파라미터에 Model 타입이 지정된 경우에는 스프링은 특별하게 Model타입의 객체를 만들어서 메서드에 주입하게 됩니다.
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이노테이션을 생성한후에 @GetMapping하여 url을 "/test/"로,
메서드에 매개변수를 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>
- 처음 Controller에 Model타입의 model의 변수 선언을 통해 ${test }부분의 test는 model.addAttribute("test", test)로인해 치환되어 model interface가 출력되었습니다.
: @RequestMapping이 부여된 메서드들은 view를 생성하는역할, 즉 Controller메서드.
: Controller는 Model을 이용해 데이터를 갖고오고, view에 데이터를 넘겨 적절한 view를 생성하는 역할.
< Controller에서 사용자에게 응답할 View를 생성할 때 Model을 이용하여 View에 데이터를 전달하는 방법 >
1. model.addAttribute(String name, Object value) ;
: value 객체를 name 이름으로 추가함.
: 뷰 코드에서는 name으로 지정한 이름을 통해서 value를 사용함.
@Controller
public class HomeController{
@RequestMapping("/")
public String home(Model model){
model.addAttribute("key", "home value");
return "home";
}
@RequestMapping("/login")
public String login(Model model){
model.addAttribute("key", "login value");
return "login";
}
}
매개변수로 전달받은 model.addAttribute("key", "value"); 메소드를 이용해서 view에 전달할 데이터를 key, value 쌍으로 전달함.
<html>
<head>
<title></title>
</head>
<body>
<%= request.getAttribute("value")%>
</body>
</html>
view(jsp) 에서 getAttribute("key") 메소드를 이용해서 해당 값 활용 가능함.
<html>
<head>
<title></title>
</head>
<body>
<h1>
key is ${key}
//home.jsp 에서는 key 값 = home value
//login.jsp 에서는 key 값 = login value
</h1>
</body>
</html>
view(jsp) 에서 ${} 를 이용해서 해당 값 활용 가능함.
2. Model addAttribute(Object value);
: value를 추가함. value의 패키지 이름을 제외한 단순 클래스 이름을 모델 이름으로 사용함.
: value가 배열이거나 컬렉션인 경우 첫 번째 원소의 클래스 이름 뒤에 "List"를 붙인 걸 모델 이름으로 사용함.
Controller에서 View로 데이터를 전달하는 방법
Controller에서 데이터를 가공하고, 이를 View에 넘겨 페이지에 표시한다.
Controller에서 View로 데이터를 넘기는 방법을 정리했다.
1. Model
model 객체를 파라미터로 받아 데이터를 넘긴다.
hashMap 형태로, 데이터를 key-value꼴로 put 해준다. (addAttribute)
model.addAttribute(String key, Object value);
이는 servlet에서 request 객체에 속성을 (key-value)꼴로 담고 다음 view jsp으로 forwarding하는 꼴이라고 생각하면 쉽다.
//servlet
request.SetAttribute(key, valueObject);
RequestDispatcher dispatcher = request.getRequsetDispatcher("next_page_path");
dispatcher.forward(request, response);
예시
@GetMapping("/members/new")
public String createForm(Model model){
model.addAttribute("name", "jinhwan");
model.addAttribute("id", "ecsimsw");
model.addAtrribute("city", "seoul");
return "members/createMemberForm";
}
jsp 문법 기준으로, ${name} / ${id} / ${city} 으로 해당하는 value를 꺼낼 수 있다.
@GetMapping("/members/new")
public String createForm(Model model){
model.addAttribute("member", new Member("jinhwan", "ecsimsw", "seoul"));
return "members/createMemberForm";
}
당연히 객체를 자체를 넘기는 것 역시 가능하다.
${member.name} / ${member.id} / ${member.city}로 가져올 수 있다.
또는 request에서 getAttribute해서 member를 받아도 된다.
Member m = (Member)request.getAttribute("member");
<출처>
'Spring' 카테고리의 다른 글
Spring. Form input값 DTO 자동 주입 (1) | 2022.10.08 |
---|---|
Spring. @AuthenticationPrincipal이란? (0) | 2022.10.07 |
Spring Security. UserDetails / UserDetailsService란? (0) | 2022.10.07 |
Spring. DI / IOC / Bean 이란? (0) | 2022.10.06 |
RESTful의 의미, REST API의 구성요소 및 설계규칙 (0) | 2022.10.06 |
댓글