일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- CRUD
- Spring
- modal #alert #sweetalert #sweetAlert #모달
- 외부접속
- Boot
- 대댓글
- DAO
- REST
- 우리마
- deferred
- paginationInfo
- SpringFramework
- egov
- 비동기
- Controller
- Today
- Total
우리마의 웹 개발
[Spring]체크된 게시물 삭제 처리 로직 본문
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 해보았다.
'WEB > Spring' 카테고리의 다른 글
[Spring]페이징 처리 EgovFramework Paginationinfo 사용하기( 설정) (3) | 2020.07.21 |
---|---|
[Spring]학생들의 성적에 대한 CRUD기능 구현(데이터베이스 없이 DAO의 List로 DB대용) (2) | 2020.02.17 |
[Spring]JSP에서 요청 파라미터를 Controller에서 처리하는 방법(커맨드 객체 사용) (0) | 2020.02.05 |
[Spring]JSP에서 요청 파라미터를 Controller에서 처리하는 방법(@RequestParam) (0) | 2020.02.05 |
[Spring]JSP에서 요청 파라미터를 Controller에서 처리하는 방법(HttpServletRequest 객체) (0) | 2020.02.04 |