스프링에서 Model

jungnoeun·2022년 9월 21일
1

spring

목록 보기
15/24

Model은 어디서 오는?
어디에서 만들어지는?
생명주기는?
사용 방법은?
실생활에서도 자주 쓰여지는지?




Model 객체란

  • Model 객체는 Controller 에서 생성된 데이터를 담아 View 로 전달할 때 사용하는 객체.

  • Model 객체는 스프링이 제공하는 모델을 사용하는 것이므로 따로 반환을 해주지 않아도 된다.

  • 생명주기: ModelAndViewContainer가 생성될 때 함께 만들어진다. Model은 Map이라고 보면 된다.

  • 이미 만들어져있는 model을 가져와서 컨트롤러의 파라미터에 전달해주기 때문에 런타임에서는 model 객체를 사용하게 됩니다.

  • Model 객체 : 속성 값을 담아두는 객체
  • ModelAndView 객체 : 속성 값 뿐만 아니라 View 이름도 담아둘 수 있는 객체




사용방법

addAttribute("key", "value") 메서드를 이용해 view에 전달할 데이터를 key, value형식으로 전달할 수 있다.
addAttribute는 Map의 put과 같은 기능과 같아서 이를 통해 해당 모델에 원하는 속성과 그것에 대한 값을 주어 전달할 뷰에 데이터를 전달할 수 있습니다.
Spring에서 Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정할 수 있습니다.



사용 예시

@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가 출력되었습니다.





@ModelAttribute

요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다.
보통 @RequestParam을 사용해서 값을 받고, set을 사용해서 값을 넣어주곤 하지만 이 과정을 자동화시켜주는 것이 @ModelAttribute이다.


@ModelAttribute를 사용하지 않을 때 (model도 같이 사용해보기)

public void item(@RequestParam String name,
                 @RequestParam int price,
                 Model model){
    Item item = new Item();
    item.setName(name);
    item.setPrice(price);
    model.addAttribute("item", item);
}

이렇게 @RequestParam으로 일일이 받아서 set을 해줘야 값이 저장된다. 하지만 @ModelAttribute를 사용하면 간단해진다.



modelAttribute 사용

public void modelAttributeEx(@ModelAttribute Item item, Model model){
	model.addAttribute("item", item);
}

이렇게 간결하게 사용 가능하다.

@ModelAttribute가 실행되는 원리를 설명하자면 요청 파라미터의 이름으로 Item 객체의 프로퍼티를 찾는다.
그리고 해당 프로퍼티의 setter를 호출해서 파라미터 값을 입력한다.

하지만 저기에서 model.addAttribute도 생략 가능하다. @ModelAttribute를 사용함으로써 model에도 자동적으로 객체가 추가 되기 때문이다.

@ModelAttribute 어노테이션도 생략가능하다.

public void ModelAttributeEx(Item item, Model model){}

최종적으로 위와 같이 쓸 수 있다.



// FormItemController - 추가
@ModelAttribute("regions")
public Map<String, String> regions() {
 Map<String, String> regions = new LinkedHashMap<>();
 regions.put("SEOUL", "서울");
 regions.put("BUSAN", "부산");
 regions.put("JEJU", "제주");
 return regions;
}

@ModelAttribute의 특별한 사용법
등록 폼, 상세화면, 수정 폼에서 모두 서울, 부산, 제주라는 체크 박스를 반복해서 보여주어야 한다. 이렇게 하려면 각각의 컨트롤러에서 model.addAttribute(...) 을 사용해서 체크 박스를 구성하는 데이터를 반복해서 넣어주어야 한다.
@ModelAttribute 는 이렇게 컨트롤러에 있는 별도의 메서드에 적용할 수 있다.
이렇게하면 해당 컨트롤러를 요청할 때 regions 에서 반환한 값이 자동으로 모델( model )에 담기게 된다.
물론 이렇게 사용하지 않고, 각각의 컨트롤러 메서드에서 모델에 직접 데이터를 담아서 처리해도 된다

@ModelAttribute("regions") 가 있는 컨트롤러를 호출할때 이 표시가 붙은 메서드가 model.addAttribute()로 이름은 ""안에 있는 것("regions")으로 하여 자동으로 모델에 담긴다.






사용 예시
https://velog.io/@jyyoun1022/Spring-Model%EA%B0%9D%EC%B2%B4
Model과 @ModelAttribute
https://dahliachoi.tistory.com/44
Model의 생명주기
https://gaebalsogi.tistory.com/45
인프런 Model관련 질문
https://www.inflearn.com/questions/576764
Model과 ModelandView
https://bestkingit.tistory.com/155

profile
개발자

0개의 댓글