-
판매 여부 체크박스스프링/스프링 MVC 패턴 2023. 2. 19. 14:06
<form action="item.html" th:action th:object="${item}" method="post">
th:object="${item}"을 입력하면 thymeleaf에서 object가 item의 객체로 인식해서 이후에 item객체에 있는 변수들을 사용할 때 간략화할 수 있다.
<input type="text" id="itemName" th:field="*{itemName}" class="form-control" placeholder="이름을 입력하세요">
th:field="${item.itemName}"으로 적어야하는 상황인데 th:field="*{itemName}으로만 적을 수 있다.
(id와 name 둘 다 지워도 됨)
판매 여부를 체크할 수 있는 체크박스
@GetMapping("/add") public String addForm(Model model) { model.addAttribute("item", new Item()); // new Item이라는 빈 객체는 addForm에서 사용하기 위해서 넣어주기 return "form/addForm"; }
우선 form/addForm에서 model을 사용할 수 있도록 GetMapping("/add")에 model.addAttribute로 빈 Item 객체를 넘겨준다.
@PostMapping("/add") public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes) { log.info("item.open={}", item.getOpen()); // 추가 Item savedItem = itemRepository.save(item); redirectAttributes.addAttribute("itemId", savedItem.getId()); redirectAttributes.addAttribute("status", true); return "redirect:/form/items/{itemId}"; }
PostMapping 방식에는 로그가 찍히게 하는 코드를 추가해준다.
(item.open을 사용하였는데 open이라는 메서드는 item객체에 open을 추가해주었다. boolean 타입으로)
addForm.html
<hr class="my-4"> <!-- single checkbox --> <div>판매 여부</div> <div> <div class="form-check"> <input type="checkbox" id="open" name="open"class="form-check-input"> <label for="open" class="form-check-label">판매 오픈</label> </div> </div>
addForm에 위의 코드를 추가해주었다. 타임리프를 사용하지 않고 일반적인 html 코드로 체크박스를 만든 것이다.
하지만 이렇게하면 큰 문제점이 있다. 로그에 출력을 했을 때, 체크박스에 체크를 하면 true 값이 잘 넘어오지만 체크를 하지 않았을 때에는 false가 아니라 null 값이 넘어온다는 것이다. 추후에 수정을 해야할 일이 있을 때 이러한 상황때문에 문제점이 생길 수가 있다.
<hr class="my-4"> <!-- single checkbox --> <div>판매 여부</div> <div> <div class="form-check"> <input type="checkbox" id="open" th:field="*{open}"class="form-check-input"> <label for="open" class="form-check-label">판매 오픈</label> </div> </div>
th:field="${item.open}"을 추가해주었다. th:field로 인해 히든 영역이 생기게 되며라는
<input type="hidden" name="_open" value="on"/>
라는 코드가 자동으로 들어가게 된다. 이 코드로 인해 체크가 되지 않으면 false라는 값이 자동으로 로그에 출력된다.
체크 하지 않았을 때
로그에 false라는 값이 넘어오게 된다. 당연히 체크박스에 체크를 하면 true가 넘어온다.
item.html
저장완료가 되었을 때 상품 상세 페이지로 넘어가는데 그 페이지에도 판매 여부를 표시하는 체크 박스를 만들어보자.
<!-- single checkbox --> <div>판매 여부</div> <div> <div class="form-check"> <input type="checkbox" id="open" th:field="${item.open}"class="form-check-input" disabled> <label for="open" class="form-check-label">판매 오픈</label> </div> </div>
맨 뒤에 disabled라는 단어를 붙였는데 이 단어가 있어야지만 상품 상세에서 박스 수정을 하지 못한다.
상품 상세 페이지에서 판매 오픈이라는 박스를 체크하지 못함
editForm.html
상품 수정 페이지에는 상품 등록인 addForm.html에 추가한 코드를 그대로 추가하면 된다.
한 가지 조심해야할 것이 있는데 변경을 해주는 update인 메소드에 findItem.setOpen(updateParam.getOpen());을 넣어줘야한다. 그렇지 않으면 수정했을 때 상품 목록에서 수정된 값이 반영되지 않는다.
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()); }
'스프링 > 스프링 MVC 패턴' 카테고리의 다른 글
라디오 버튼 (상품 종류 : 도서, 식품, 기타) (0) 2023.02.19 체크 박스의 다중(지역: 서울, 부산, 제주) (0) 2023.02.19 상품 웹 사이트 - 리다이렉트 (0) 2023.02.16 상품 웹 사이트 - 상품 수정 (0) 2023.02.16 상품 웹 사이트 - 상품 등록 (0) 2023.02.16