@ModelAttribute를 이용한 스프링 컨트롤러 메소드 매핑
1. @ModelAttribute
n @ModelAttribute는 메서드 매개 변수안 또는 메서드 위에 기술되어 특정 객체를 Model 객체로 등록하여 JSP와 같은 VIEW에서 사용가능 하도록 하는 어노테이션 이다.
n 메서드 괄호의 매개 변수로 사용되는 경우 HTTP요청(Request) 파라미터 값들을 자동으로 지정한 모델 객체에 넣어준다. 이것은 @RequestParam으로 하나씩 받아서 처리하는 것보다 효율적 이며 이때 @ModelAttribute를 Command 객체라고도 한다.
n 클라이언트에서 요청 파라미터로 넘기는 값들이 @ModelAttribute로 지정한 객체에 자동 바인딩 된다. 바인딩된 객체는 view에 별도로 리턴해 주지 않아도 사용 가능하다. (ModelAttribute로 지정된 객체는 별도 선언없이 VIEW가 되는 JSP에서 접근 가능하다.)
n @SessionAttributes로 지정해둔 모델이면 세션에서 가져오고 아니면 기본 생성자로 객체를 만든다. 해당 모델 오브젝트 속성에 해당하는 값을 HTTP 요청 파라미터에서 가져와서 바인딩 한다.
@RequestMapping(value = "/addEmp", method = RequestMethod.POST)
public String addEmp(@ModelAttribute("emp") Emp emp, ModelMap model) {
}
n 메소드명 위에 사용될 수도 있는데 Spring-MVC는 컨트롤러의 다른 요청 핸들러 메소드를 호출하기 전에 항상 메소드명 위에 @ModelAttribute가 붙은 메소드를 먼저 호출한다. 메소드에서 리턴하는 객체를 Model로 등록하거나, 스프링에서 JSP 뷰 파일에 반환되는 Model 객체에 특정한 속성값을 주입한다.
n @RequestMapping, @GetPapping, @PostMapping 어노테이션이 붙은 컨트롤러 메서드가 호출되기 전에 모델 객체를 만들기 위해 메소드명 위에 @ModelAttribute가 붙은 메소드를 호출하는 것이다.
n @ModelAttribute를 모든 Controller에 전역적으로 사용한다면 @ControllerAdvice에 선언하면 된다. 매번 Controller에 작성하지 않고 @ControllerAdvice 이용해서 한번만 작성하면 된다.
n 예제1
1. 컨트롤러
@Controller
public class ModelController {
@ModelAttribute(name= "emplist")
public List<String> initEmp() {
List<String> emps= new ArrayList<String>();
emps.add("홍길동"); emps.add("김길동");
return emps;
}
@RequestMapping(value= "/list", method= RequestMethod.GET)
public ModelAndView list(@ModelAttribute(name= "emplist") List<String> emps) {
ModelAndView modelview = new ModelAndView();
modelview.addObject("title", "사원목록");
modelview.setViewName("emp_list");
return modelview;
}
}
2. JSP
<div id="title">${title}</div>
<div> </div>
<table>
<tr>
<td>${empslist}</td>
</tr>
</table>
n 예제2
1. jsp
<h2>${msg}</h2>
<p>${empno}</p>
<p>${ename}</p>
2. 모델
public class Emp {
private long empno;
private String ename;
public Emp(long empno, String ename) {
this.empno = empno;
this.ename = ename;
}
// getters and setters
}
3. 컨트롤러
// @ModelAttribute를 모든 Controller에 전역적으로 사용한다면
// @ControllerAdvice에 선언하면 된다.
// 사원을 입력 후 입력된 사원 데이터를 JSP로 보내서 출력한다.
@Controller
@ControllerAdvice //@ModelAttribute로 등록한 모델 객체를 모든 컨트롤러에서 사용가능
public class EmpController {
private Map<Long, Emp> empMap = new HashMap<>();
// 컨트롤러의 모든 Mdel 객체에 msg 속성을 추가한다.
// /addEmp 요청이 올때 addAttributes () 메서드는 addEmp() 메소드 보다 먼저 실행되지만
// addAttributes(), addEmp() 둘 다 실행 한 후에는 JSP에서 msg 속성을 참조할 수 있다.
// Controller에 @ControllerAdvice가 붙어 있으면 모든 컨트롤러의 모든 Model 객체에
// msg 속성이 추가되는 것이다.
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("msg", "Welcome to Spring World!");
}
// addEmp 요청이 오면 "emp" 모델 객체를 찾고 없으면 Emp의 새 인스턴스를 만들어
// "emp"라고 Model로 등록하고 요청 파라미터 값들을 채운다.
@RequestMapping(value = "/addEmp", method = RequestMethod.POST)
public String addEmp(@ModelAttribute("emp") Emp emp, ModelMap model) {
model.addAttribute("ename", emp.getEname());
model.addAttribute("empno", emp.getEmpno());
empMap.put(emp.getEmpno(), emp);
return "emp";
}
}
#스프링동영상, #스프링강좌, #스프링모델, #스프링, #@ModelAttribute, #@ModelAttribute,#Spring@ModelAttribute,#스프링프레임워크,#Spring동영상,#스프링강의,#모델어트리뷰트
댓글 없음:
댓글 쓰기