Spring
[Spring] Model 객체과 @ModelAttribute
Gray__
2022. 3. 15. 14:48
Model
스프링에서 모델 객체는 컨트롤러에서 생성된 데이터를 담아 View로 전달할 때 사용하는 객체이다.
Model 객체를 model이라고 하면 model.addAttribute("key", "value") 형태의 메소드를 이용해 view에 데이터를 전달한다.
@GetMapping("/{itemId}")
public String item(@PathVariable long itemId, Model model) {
Item item = itemRepository.findById(itemId);
model.addAttribute("item", item);
return "form/item";
}
@ModelAttribute
등록, 조회, 수정 폼에서 모두 공통된 데이터를 보여주어야 하는 경우에 어노테이션을 사용하지 않으면 해당 함수 내에서 같은 코드를 반복적으로 작성해야한다. 즉 각각의 컨트롤러에서 model.addAttribute(...)을 사용해서 구성하는 데이터를 반복해서 넣어주어야 한다.
@ModelAttribute 는 이렇게 컨트롤러에 있는 별도의 메서드에 적용할 수 있다.
ModelAttribute는 전달받은 파라미터를 Model 객체에 담아서 전달하도록 할 때 필요한 어노테이션이다. 해당 컨트롤러를 요청하게 되면 자동으로 Model 객체에 데이터가 담겨진다. 이렇게하면 해당 컨트롤러를 요청할 때 regions 에서 반환한 값이 자동으로 모델( model )에 담기게 된다. 물론 이렇게 사용하지 않고, 각각의 컨트롤러 메서드에서 모델에 직접 데이터를 담아서 처리해도 된다.
// 컨트롤러가 호출되면 자동으로 Model 객체에 담긴다
@ModelAttribute("regions")
public Map<String, String> regions(){
Map<String, String> regions = new LinkedHashMap<>();
regions.put("SEOUL", "서울");
regions.put("BUSAN", "부산");
regions.put("JEJU", "제주");
return regions;
}
View를 보여주는 코드, 어노테이션 ( ) 내부에 있는 값을 통해서 데이터들을 호출할 수 있다
<div>
<div>등록 지역</div>
<div th:each="region : ${regions}" class="form-check form-check-inline">
<input type="checkbox" th:field="*{regions}" th:value="${region.key}"
class="form-check-input">
<label th:for="${#ids.prev('regions')}"
th:text="${region.value}" class="form-check-label">서울</label>
</div>
</div>