ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 판매 여부 체크박스
    스프링/스프링 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());
    }
Designed by Tistory.