-
체크 박스의 다중(지역: 서울, 부산, 제주)스프링/스프링 MVC 패턴 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들이 타임리프가 생성해주기 때문에 그 아이디를 사용하는 코드이다.
웹 사이트의 버튼과 버튼을 눌렀을 때의 로그 출력이다.
'스프링 > 스프링 MVC 패턴' 카테고리의 다른 글
셀렉트 박스 (배송 방식 : 빠른 배송, 일반 배송, 느린 배송) (0) 2023.02.19 라디오 버튼 (상품 종류 : 도서, 식품, 기타) (0) 2023.02.19 판매 여부 체크박스 (0) 2023.02.19 상품 웹 사이트 - 리다이렉트 (0) 2023.02.16 상품 웹 사이트 - 상품 수정 (0) 2023.02.16