스프링/스프링 MVC 패턴
체크 박스의 다중(지역: 서울, 부산, 제주)
chanhee01
2023. 2. 19. 14:59
체크 박스를 하나만 선택하는 것이 아니라 여러개를 만들어놓고 중복으로 체크를 하거나 여러개 중에서 고를 수 있도록 체크박스를 여러개 만들어 볼 것이다.
@GetMapping("/{itemId}")
public String item(@PathVariable long itemId, Model model) {
Item item = itemRepository.findById(itemId);
model.addAttribute("item", item);
// 추가
Map<String, String> regions = new LinkedHashMap<>();
regions.put("SEOUL", "서울");
regions.put("BUSAN", "부산");
regions.put("JEJU", "제주");
model.addAttribute("regions", regions);
// 추가
return "form/item";
}
위에 추가라고 써있는 부분의 코드가 추가가 되어야 한다. 해쉬 맵으로 3개의 데이터가 저장되어있어야 하고 이 코드는 상품 상세 페이지, 상품 등록, 상품 수정의 세 메서드에 동일하게 들어가야하는데 중복된 코드라서 개발자 입장에서는 좋지 않다.
@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에 담기게 된다. 따라서 위와 같이 중복된 코드를 개별 메서드에서 지울 수 있게 된다.
만약 addForm이 호출이 @ModelAttribute에 있는 내용이 model에 자동으로 담기게 되고 어느 메서드에서나 동일하게 담기게 되는 기능이다.
public void update(Long itemId, Item updateParam) {
Item findItem = findById(itemId);
findItem.setItemName(updateParam.getItemName());
findItem.setPrice(updateParam.getPrice());
findItem.setQuantity(updateParam.getQuantity());
findItem.setOpen(updateParam.getOpen());
findItem.setRegions(updateParam.getRegions());
}
오픈 여부와 같이 update 메서드에 region도 update 코드를 만들어준다.
<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>
addForm.html, editForm.html, item.html에 위의 코드를 추가해주면 된다.
이전 게시글에서 단일 체크 박스를 했을 때와 동일한데 차이점이 있다면 th:each를 통해 해쉬 맵으로 반복문을 돌렸다는 것이다.
"${#ids.prev('regions')}"는 regions의 id들이 타임리프가 생성해주기 때문에 그 아이디를 사용하는 코드이다.
웹 사이트의 버튼과 버튼을 눌렀을 때의 로그 출력이다.