Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

우리마의 웹 개발

[Spring]체크된 게시물 삭제 처리 로직 본문

WEB/Spring

[Spring]체크된 게시물 삭제 처리 로직

우리마 2020. 1. 17. 13:41

Spring 환경에서 게시판에서의 CRUD기능 구현 중 삭제처리를 할 때 하나하나씩 삭제하는 방법도 있지만 checkbox를 통해 다중 삭제를 구현할 상황이 있다.

이때 JSP, Jquery, Ajax, Java에서의 처리 방법을 구글링을 하지 않고

내 머릿속의 로직을 소개한다.

HTML , JSP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<table>
            <colgroup>
                <col width="8%">
                <col width="15%">
                <col width="52%">
                <col width="25%">
            </colgroup>
                <thead>
                    <tr>
                        <th><input type="checkbox" name="reportChkBx"onclick="checkAll();"></th>
                        <th>날짜</th>
                        <th>제목</th>
                        <th>이름</th>
                    </tr>
                </thead>
                <tbody id="reportList">
                    <tr>
                        <td><input type="checkbox" name="reportChkBxRow" id="4"></td>
                        <td>20/01/16</td>
                        <td>TEST글1</td>
                        <td id="frstRegisterId_1">USER1</td>
                    </tr>
                    <tr>
                        <td><input type="checkbox" name="reportChkBxRow" id="3"></td>
                        <td>20/01/16</td>
                        <td>TEST글2</td>
                        <td id="frstRegisterId_2">USER1</td>
                    </tr>
                </tbody>
</table>
 
cs

사실 tbody의 리스트 들은 script에서 ajax통신을 통해 DB 조회 이후 목록을 append 한 건데

알아보기가 힘들 거같에서 간단히 목록 2개만 예시로 가져다 소개한다.

 

10번 라인에 onclick 함수는 thead의 체크박스를 체크했을 때 모든 체크박스가 체크되는 함수다.

여기서 확인해야 될 것은 18번 라인관 24번 라인의 input의 name속성 값이 같다는 것이다.

왜냐하면 script에서 name값으로 check 된 checkbox를 찾기 때문이다. 또한 id값들은 RPRT_ODR이라는 내 DB 테이블의 고유식별자인데 ajax에서 name값으로 id값을 찾아서 Controller에 넘겨준다

JavaScript & Ajax
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function deleteReport(){
        var cnt = $("input[name='reportChkBxRow']:checked").length;
        var arr = new Array();
        $("input[name='reportChkBxRow']:checked").each(function() {
            arr.push($(this).attr('id'));
        });
        if(cnt == 0){
            alert("선택된 글이 없습니다.");
        }
        else{
            $.ajax = {
                type: "POST"
                url: "OOOO.do"
                data: "RPRT_ODR=" + arr + "&CNT=" + cnt,
                dataType:"json",
                success: function(jdata){
                    if(jdata != 1) {
                        alert("삭제 오류");
                    }
                    else{
                        alert("삭제 성공");
                    }
                },
                error: function(){alert("서버통신 오류");}
            };
        }
    }
 
  cs

 

삭제라는 버튼이 있다 치고 버튼을 눌렀을 때 실행되는 함수인 deleteReport이다.

이 함수에서 실행되는 게 가장 중요하다.

Line 3 : $("input[name='reportChkBxRow']:checked").length

이것은 input 태그 중 name 이 reportChkBxRow 이것들 중에 check 된 것들의 개수를 구하는 jquery 문법이다. 이 개수를 구하는 이유는 Controller로 check 된 개수를 보내줘서 그 개수 만큼 delete문을 실행하기 때문이다.

Line 4 : Array객체를 생성하는 이유는 check된 것들의 id값을 배열에 담고 배열 객체를 Controller로 넘겨주기 때문이다

Line 5~7 : 이 부분이 핵심이다. $("input[name='reportChkBxRow']:checked")이부분은 checkbox 중 check된것의 Jquery선택자 이고  .each 메서드는 Jquery를 사용해 배열을 관리하고자 할 때 사용할 수 있는데 매개 변수로 받은 것을 사용 해 반복문과 같이 배열이나 객체의 요소를 검사할 수 있는 메서드이다.

.each() 꿀팁 : https://webclub.tistory.com/455

 

arr.push($(this).attr('id')); 이 부분은 .each 메서드 안에서 동작하며 id값을 배열의 0번째 index부터 저장하는 건데 C나 JAVA에 익숙하신 분들이라면 for, while을 이용해서 arr [i] = OOO 이런 식으로 할 것이다 하지만! arr객체가 동적인 배열이라서 대입연산자를 사용해서 삽입할 수없다. 자료구조에서 linkedList와 비슷하다고 생각하면 쉽게 이해할 수 있다. 따라서 Array라는 자료구조에 맞는 삽입 함수를 이용해 저장해줘야 한다. 그 함수가 push임!

this는 현재 객체라는 거 다들 알 테고 attr메서드를 이용해 id값을 추출해낸다.

Controller

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RequestMapping("OOOO.do")
    @ResponseBody
    public int deleteReport(Map<String,Object> commandMap) throws Exception{
        int result=1;
        try {
            int cnt = Integer.parseInt((String) commandMap.get("CNT"));
            String rprtOdr = (String)commandMap.get("RPRT_ODR");
            String [] strArray = rprtOdr.split(",");
            for(int i=0; i<cnt; i++) {
                int temp = Integer.parseInt((String)strArray[i]);
                commandMap.put("RPRT_ODR", temp);
               myService.delete("ReportDAO.deleteReport", commandMap);
            }
        } catch (Exception e) {
            log.debug(e.getMessage());
            result=0;
        }
        return result;
       }
 
cs

 

Contorller에서 return 값이 1 또는 0인데 script에서 받을 때 1이면 성공, 0이면 실패인 것이다.

일단 여기서 알고 들어가야 될 부분이 Ajax에서 Data속성에 적어준 값들이 commandMap에 Map형식으로 담긴다.

Line 6 :  cnt라는 int형 변수를 하나 선언과 동시에 정의하는데 Ajax에서 Controlle로 보낸 데이터 중 CNT라는 값을 commandMap에서 가져와서 int형으로 바꾼 후 cnt라는 자바 변수에 저장하는 것이다.

그런데 JS에서 int형으로 변수를 정의했을지언정 Controller로 넘어오면서 commandMap에 담기면서 자동으로 Map형식으로 변환되기 때문에 형 변환을 해주어야 한다. 그런데 단순히 (int) 이렇게 형 변환을 하면 commandMap에 담긴 값들을 형변환 할 수없다. 이유는 나도 잘모르겟다. 그런데 먼저 String으로 형변환을 해줘야되는데 그건 (String)이렇게 하면된다.... 아무튼 그래서 Wrapper class 인 Integer를 사용하여 형변환을 해주어야 한다.

Line 7 : RPRT_ODR을 commandMap에서 가져와서 String으로 형 변환하고 rprtOdr이라는 String 변수에 저장한다. RPRT_ODR이라는 것은 프라이머리 키라고 아까 위에서 말했다.

근데 이 값이 JS에서 .each() 메서드로 배열에 저장되어서 Controller로 넘어왔잔슴? 

그래서 commadnMap에 담길 때는 [1,2,3...]  이런 식으로 담겨서 넘어온다는 거다.

그래서 다음 라인에서 split이라는 메서드를 이용해 ', ' 콤마 기준으로 잘라준 것을 String 배열에 저장한다는 로직이다!

Line 9~12 : for문인데 0번째 index부터 cnt가 체크된 체크박스의 개수니까 그만큼 반복문을 돌면서 delete query문을 실행하는 건데 10,11라인은 생각해보니까 RPRT_ODR은 DB 테이블에서 data type 이 numeric이다 그래서 query를 실행할 때는 int형으로 바꿔서 다시 commandMap에 put 해주고 query를 실행하는 것이다.

 

DAO와 SQL문은 생략하겠다.

 

이걸 나는 구글링 안하고 내 머가리 속에서 로직을 thinking 해보았다.

 

Comments