20220901 [Spring Boot]

Yeoonnii·2022년 9월 1일
0

TIL

목록 보기
17/52
post-thumbnail

물품조회

📁 ItemController.java

Model에 데이터를 담을 때 addAttribute( ) 메소드를 사용
Model addAttribute(String name, Object value)

// 물품조회 목록 생성
    @GetMapping(value = "/selectlist.do")
    public String selectListGET(Model model){
        // 화면나오기전에 아이템데이터 가져와야 함
        List<Item> list = itemService.selectListItem();
        System.out.println(list.toString());
        model.addAttribute("list", list);

        return "itemlist";
    }

📁 itemlist.html

테이블에 데이터 출력하기
➡️ ItemController에서 넘어온 list를 반복문을 이용해 테이블로 출력

1.list 반복문 생성 후 tmp에 넣는다
<tr th:each="tmp, idx : ${list}">
2. tmp에 넣은 값 출력

	<td th:text="${tmp.no}"></td>
	<td th:text="${tmp.name}"></td>
	<td th:text="${tmp.price}"></td>
	<td th:text="${tmp.quantity}"></td>
	<td th:text="${tmp.regdate}"></td>

물품 일괄 삭제/수정

📁 itemlist.html

  1. checkbox에 선택된 항목의 no들을 tmp.value값으로 넘겨준다
    <input type="checkbox" th:value="${tmp.no}" name="no" />
  2. <form>안에 submit 2개 + name + value값 생성
    ➡️ 보내는 주소는 같은곳으로 간다 = /item/updatedelete.do
    <form th:action="@{/item/updatedelete.do}" method="post">
    <input type="submit" name="btn" value="일괄삭제"  />
    <input type="submit" name="btn" value="일괄수정" />
  • 사용자가 화면에서 물품을 선택하지 않고 일괄삭제/일괄수정을 클릭한 경우
    원래는 frontend에서 유효성 처리를 진행하여 backend에 빈 데이터를 넘겨주지 않아야 하는게 맞다
    backend에서 굳이 처리를 해야겠다면 사용자가 no를 선택하지 않은 상태에서 일괄삭제/일괄수정을 클릭한 경우 물품 목록 화면으로 돌아오게 하면 된다

    ItemController.java 에서

    1. no를 받는 @RequestParam(name = "no”required = false를 추가해준 후
    2. if문으로 처리 해 준다! 이 코드는 if(btn.equals)… 이전에 실행되어야 한다
    • 📁 ItemController.java
    if (no == null) { // 번호가 없는경우, 오류처리
    return "redirect:/item/selectlist.do";
    }
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>물품조회</title>
</head>

<body>

    <form th:action="@{/item/updatedelete.do}" method="post">

    <!-- th:onclick="|javascript:deleteAction()|" -->
    <input type="button" name="btn" value="일괄삭제" />
    <input type="submit" name="btn" value="일괄수정" />

    <table border="1">
        <tr>
            <th>선택</th>
            <th>물품번호</th>
            <th>물품명</th>
            <th>가격</th>
            <th>수량</th>
            <th>등록일</th>
        </tr>

        <tr th:each="tmp, idx : ${list}">
            <td><input type="checkbox" th:value="${tmp.no}" name="no" /></td>
            <td th:text="${tmp.no}"></td>
            <td th:text="${tmp.name}"></td>
            <td th:text="${tmp.price}"></td>
            <td th:text="${tmp.quantity}"></td>
            <td th:text="${tmp.regdate}"></td>
        </tr>
    </table>
</form>

<script type="text/javascript">
    const deleteAction = () => {
        const ret = confirm('삭제할까요?');
        if (ret === true) {
            document.getElementById("form").submit(); // id = form 을 찾아서 submit
        } //취소하면 아무일도 일어나지 않음
    }
</script>    
</body>

</html>

📁 ItemController.java

  1. itemlist.html에서 일괄삭제/일괄수정 중 어떤 버튼 눌렀는지 확인하기 위해 @RequestParam으로 받으면 알 수 있다
  2. 선택한 checkboxno는 배열로 온다! 배열로 받기
    ➡️ 삭제/수정시 noList로 담은 형태가 필요하기 때문에 List<Long> no로 받는다
  • 수정하려면 선택 항목의 Item정보 가져오고, 수정할 수 있게 만들어야한다
    ➡️ 다른 주소로 이동하여 수정 진행, 다른 페이지로 이동시 no 정보 가져가기 위해 sessionno를 담고 이동한다
  • 삭제 후 목록으로 이동해야 한다
    // http://127.0.0.1:8080/ROOT/item/updatedelete.do
    // 아이템 일괄삭제/일괄수정
    @PostMapping(value = "/updatedelete.do")
    public String updatedeletePOST(
            @RequestParam(name = "btn", required = false) String btn,
            @RequestParam(name = "no", required = false) List<Long> no) {

        // System.out.println("btn.toString" + btn.toString()); 확인용
        // System.out.println("no.toString" + no.toString()); 확인용

        if (btn.equals("일괄삭제")) {
            // 삭제 후 목록으로 이동
            itemService.deleteItem(no);
        } else if (btn.equals("일괄수정")) {

            httpSession.setAttribute("SESSION_NO", no);
            return "redirect:/item/update.do";
        }
        // 오류시 목록으로 보내기
        return "redirect:/item/selectlist.do";

    }

📁 ItemService.java

수정/삭제 서비스 생성

  • 삭제시 iRepository.deleteItem(no); ➡️ 바로 listno를 넣어주면 된다
  • Optional<T> : 저장된 값이 존재하면 그 값을 반환하고, 값이 존재하지 않으면 인수로 전달된 값을 반환
// 물품 일괄수정
        public int updateBatch(List<Item> list){
            try {
                // 수정된 내용 저장될 새 배열 생성
                List<Item> saveItem = new ArrayList<>();

                // 1. 변경하고자 하는 항목만큼 반복
                for( Item item : list ){
                    
                    // 2. 변경하기 전 내용 가져오기
                    Item retItem = iRepository.findById(item.getNo()).orElse(null);
                    if(retItem != null){
                        //  변경할 항목으로 내용 저장
                        retItem.setName(item.getName());
                        retItem.setPrice(item.getPrice());
                        retItem.setQuantity(item.getQuantity());

                        // 만들어 놓은 새 배열에 변경항목 넣기
                        saveItem.add(retItem);
                    }
                }
                // 일괄저장
                List<Item> retlist =  iRepository.saveAll(saveItem);
                
                // 변경여부 확인시 != null보다 방법이 좀 더 상세하다
                if(retlist.size() == saveItem.size()){
                    return 1;
                }
                return 0;
            } catch (Exception e) {
                e.printStackTrace();
                return -1;
            }
        }

// 물품 일괄삭제
        public int deleteItem(List<Long> ids){
            try {
                iRepository.deleteAllById(ids);
                return 1;
            } catch (Exception e) {
                e.printStackTrace();
                return -1;
            }
        }

📁 itemupdate.html생성

  • 기존데이터 가져올 <table> 생성
  • 수정한 데이터 보낼 <form> 생성 ➡️ <form th:action="@{/item.update.do}" method="post">
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>일괄수정</title>

    <form th:action="@{/item/update.do}" method="post">
    <table border="1">
        <tr>
            <th>물품번호</th>
            <th>물품명</th>
            <th>가격</th>
            <th>수량</th>
            <th>등록일</th>
        </tr>
        <tr th:each="tmp, idx : ${list}">
            <td><input type="text" name="no" th:value="${tmp.no}" readonly style="background-color: #cccccc;"></td>
            <td><input type="text" name="name" th:value="${tmp.name}"></td>
            <td><input type="text" name="price" th:value="${tmp.price}"></td>
            <td><input type="text" name="quantity" th:value="${tmp.quantity}"></td>
            <td th:text="${tmp.regdate}" style="background-color: #cccccc;"></td>
        </tr>
    </table>
    <input type="submit" value="일괄수정" />
</form>
</head>
<body>
    
</body>
</html>

📁 ItemController.java

  • 아이템 수정 페이지에서 수정 전 데이터 가져올 때 (List<Long>)형변환시 데이터 손실 가능성이 있어서 주의경고가 뜬다 ➡️ @SuppressWarnings("unchecked") 사용하여 형변환 경고 체크하지 않게 설정
    // http://127.0.0.1:8080/ROOT/item/updatedelete.do
    // 아이템 수정 페이지(데이터 가져오기)
    @SuppressWarnings("unchecked") // 형변환 경고 체크하지 않음
    @GetMapping(value = "/update.do")
    public String updateGET(Model model) {
        List<Long> no = (List<Long>) httpSession.getAttribute("SESSION_NO");

        List<Item> list = itemService.selectListNoIn(no);

        model.addAttribute("list", list);

        return "itemupdate";
    }

    // 물품 수정하기
    // http://127.0.0.1:8080/ROOT/item.update.do
    @PostMapping(value = "/update.do")
    public String updatePOST(
            @RequestParam(name = "no") Long[] no,
            @RequestParam(name = "name") String[] name,
            @RequestParam(name = "price") Long[] price,
            @RequestParam(name = "quantity") Long[] quantity) {

        List<Item> list = new ArrayList<>();
        // 배열을 list로 변환
        for (int i = 0; i < no.length; i++) {
            Item item = new Item();
            item.setNo(no[i]);
            item.setName(name[i]);
            item.setPrice(price[i]);
            item.setQuantity(quantity[i]);
            list.add(item);
        }
        int ret = itemService.updateBatch(list);
        System.out.println("ret" + ret);
        if (ret == 1) { // 수정 완료된 경우
            return "redirect:/item/selectlist.do";
        } else { // 수정되지 않은경우
            return "redirect:/item/selectlist.do";

        }

0개의 댓글