Java / Spring
@ModelAttribute 본문
@ModelAttribute(" ") 애노테이션 내부에 객체를 지정하면 컨트롤러 내의 메서드들 각 Model 객체에 추가된다. model.addAttribute(" ") 내부에 명시적으로 선언하지 않아도 선언한 효과를 가지게 된다.
코드로 이해하기
@ModelAttribute("regions") // 해당 애노테이션 사용 시 아래 regions 객체가 모두 model.addAttribute() 에 들어가는 item 에 담기게 된다.
public Map<String, String> regions() {
Map<String, String> regions = new LinkedHashMap<>();
regions.put("SEOUL", "서울");
regions.put("BUSAN", "부산");
regions.put("JEJU", "제주");
return regions;
}
같은 컨트롤러 내에 @ModelAttribute("regions") 정의 한뒤 regions 라는 메서드 내부에 아래와 같은 기능을 추가하였다.
만약, @ModelAttribute 를 선언 하지 않았다면 다른 메서드에서 model.addAttribute("regions", regions) 를 추가해야 하지만
현재 @ModelAttribute 애노테이션에 regions 가 정의 되어 있기 때문에 명시적으로 선언하지 않아도 regions 의 기능을 모델 객체에 담아준다.
예를 들어, 아래의 코드는 모델 객체에 items 라는 객체를 담고있다. 하지만 regions 도 모델객체에 담고 있는 것이다. 결과적으로 애노테이션으로 선언한 regions 는 명시적으로 Model 객체에 담지 않아도 담은 것으로 간주되기 때문에 외부에서도 사용이 가능해진다 .
@GetMapping
public String items(Model model) {
List<Item> items = itemRepository.findAll();
model.addAttribute("items", items);
return "form/items";
}
이를 활용하는 방법은 타임리프를 활용한 체크박스에서 해당 객체 호출이 가능해진다.
(타임 리프의 체크박스 기능을 사용하여 regions 로 put 시킨 데이터를 순차적으로 반복하여 체크박스 생성)
<div>등록 지역</div>
<div th:each="region : ${regions}">
<input type="checkbox" th:field="*{regions}" th:value="${region.key}"/> <span th:text="${region.value}"></span>
</div>
<button type="submit">저장</button>
'Spring > Annotaion' 카테고리의 다른 글
log (0) | 2024.05.25 |
---|---|
@DiscriminatorColumn (+ @DiscriminatorValue) (0) | 2024.05.06 |
@PostConstruct, @PreDestroy (0) | 2024.05.04 |
@ComponentScan ( + @Autowired) (2) | 2024.05.02 |
@Configuration (0) | 2024.05.02 |