일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Java
- 국제화
- JSTL
- RequestMethod.POST
- 동적쿼리
- 쿼리
- NPM
- MVC
- react
- vscode
- 서드파티모듈
- C#크롤링
- c:choose
- c:forEach
- JavaScript
- 콜백
- fullcalendar
- AndroidStudio
- Callback
- HTTP
- mybatis
- android
- node.js
- iBATIS
- Spring
- egov
- jsx
- jQuery
- MySQL
- SQL
- Today
- Total
Today Yewon Learned
[Egov] Spring MVC 구조로 파일 삭제하기 본문
[구현 목표]
콘텐츠 목록에서 사용 중인 파일은 삭제 버튼을 누르면 삭제할 수 없다는 경고창과 목록을 띄우고,
콘텐츠 목록에서 사용 중이 아닌 파일은 삭제 버튼을 누르면 삭제되도록 구현해야한다.
[index.jsp]
파일보관함 <div> 태그 아래에 table을 bind하여 업로드한 파일 목록을 나타내었다.
<div id="upload_file_list" style="position: absolute; width: 400px; height: 40%; border: 1px solid; z-index: 999; left: 60%; margin-top: 150px; display: none; background: #ffffff;">
<div class="card shadow">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold text-primary">파일 보관함</h6>
<button type="button" class="btn btn-secondary btn-sm" onclick="pop_file_list_cancel();">닫기</button>
</div>
</div>
<div id="file_bind"></div>
</div>
[js_file Table]
[js_contents_detail Table]
[ibatis이용 - Contents_SQL.xml]
js_contents_detail 테이블에서 CONT_ITEM의 갯수를 조회하기 위한 쿼리이다.
ex) F2022020001.mp4 파일이 콘텐츠 목록에 몇 개 사용되었는지 카운트함
<select id="contentsDao.getUseFileCnt" resultClass="int">
<![CDATA[
SELECT
IFNULL(COUNT(*), 0) AS CNT
FROM js_contents_detail
WHERE CONT_ITEM = #CONT_ITEM#
]]>
</select>
[ibatis이용 - File_SQL.xml]
view에서 GetData로 넘긴 FILE_CD를 이용해서 ORG_FILE_NM(파일 이름)을 검색하기 위한 쿼리이다.
<select id="fileDao.getFileUseNM" resultClass="String">
SELECT
ORG_FILE_NM
FROM js_file
WHERE FILE_CD = #FILE_CD#
</select>
[index.jsp]
UI에서 삭제버튼을 누르면 each()메서드가 bind된 table을 반복문을 이용하여 check여부를 확인한다.
check == true이면,
GetData로 받은 값을 배열의 형태로 JsonDataAjax를 이용해 ./file_deleteAction.do의 value로 Controller에 전송한다.
//파일보관함 - 파일 삭제
function btn_file_remove() {
var arr = new Array();
$('#file_table1 tr').each(function(){
if($(this).find("td").eq(0).find("input:checkbox").is(":checked") == true) {
arr.push(GetData(this));
//this.remove();
}
});
if(arr.length == 0) {
alert('삭제할 파일이 없습니다.');
return false;
}
if(arr.length > 0) {
var jsonString = JSON.stringify(arr);
JsonDataAjax('./file_deleteAction.do', jsonString, remove_file_result);
}
}
function GetData(obj) {
var data = new Object();
data.FILE_CD = $(obj).find("td").eq(2).find("input").val();
data.TRANS_FILE_NM = $(obj).find("td").eq(1).attr("id");
return data;
}
function remove_file_result(data) {
//console.log(data);
//const obj = JSON.parse(data);
if(!data.delete_result){ //삭제할 파일이 사용중인 경우
alert(data.msg + "\n" + data.use_file_list);
}
$('#file_table1 tbody tr').each(function(){
console.log($(this).find('td').eq(2).find("input").val());
for(var i = 0; i < data.remove_list.length; i++){
if(data.remove_list[i] == $(this).find('td').eq(2).find("input").val()){
$(this).remove();
continue;
}
}
});
}
[FileController.java]
List와 map을 이용하여 JSON으로 보낸 다수 데이터 받아오기
view에서 "TRANS_FILE_NM"으로 보낸 문자열을 setCONT_ITEM하여 contdata로 검색한다.
getUseFileCnt쿼리를 이용하여 CONT_ITEM파일의 사용 개수를 카운트한다.
파일이 사용 중인 경우 (file_cnt>0) 일 때,
view에서 "FILE_CD"으로 보낸 문자열을 이용하여 getFileUseNM 쿼리를 검색한다.
getFileUseNM 쿼리의 SELECT값은 ORG_FILE_NM이기 때문에, 사용 중인 파일의 이름이 결과 값으로 나온다.
use_file_list.add(("\n●" + file_nm); 위에서 선언한 use_file_list에 file_nm값을 넣어준다.
파일이 사용 중이 아닌 경우 (file_cnt=0) 일 때,
fileService.deleteFileInfo(data)를 이용해 파일 삭제
JSONObject를 이용하여 view로 데이터 전송 (사용중인 파일 리스트, 삭제할 파일 리스트)
view에서는 console.log(data.use_file_list); 로 controller에서 보낸 list 목록 확인 가능
//파일 보관함 - 삭제 기능
@ResponseBody
@RequestMapping(value = "file_deleteAction.do", produces = "application/text; charset=UTF-8", method = RequestMethod.POST)
public String file_deleteAction(@RequestBody String paramData) throws Exception {
List<Map<String,Object>> resultMap = new ArrayList<Map<String,Object>>();
resultMap = JSONArray.fromObject(paramData);
boolean action_result = true;
String Msg = "";
List<String> use_file_list = new ArrayList<String>();
List<String> remove_list = new ArrayList<String>();
FileData data = new FileData();
for (Map<String, Object> map : resultMap) {
File file = new File(uploadPath+ "\\" + map.get("TRANS_FILE_NM").toString());
ContentsData contdata = new ContentsData();
contdata.setCONT_ITEM(map.get("TRANS_FILE_NM").toString()); //view에서 보낸 TRANS_FILE_NM 문자열로 contdata 조회
int file_cnt = contentsService.getUseFileCnt(contdata); //콘텐츠 목록에서 사용 중인 파일 개수 카운트
if(file_cnt > 0) {
String file_nm = fileService.getFileUseNM(map.get("FILE_CD").toString());
use_file_list.add("\n- " + file_nm);
action_result = false;
Msg = "아래 파일은 사용하고 있으므로 삭제할 수 없습니다.";
continue;
} else if(file.exists()) {
file.delete();
remove_list.add(map.get("FILE_CD").toString());
data.setFILE_CD(map.get("FILE_CD").toString());
fileService.deleteFileInfo(data);
}
}
JSONObject data_obj = new JSONObject();
data_obj.put("delete_result", action_result);
data_obj.put("msg", Msg);
data_obj.put("use_file_list", use_file_list);
data_obj.put("remove_list", remove_list);
return data_obj.toString();
}
[결과]
FILE_CD로 검색한 파일이 사용 중인 경우에는 파일을 삭제 하지 않고, 사용 목록을 띄워준다.
'Spring > Egov' 카테고리의 다른 글
[Egov] There is no statement named [DB 매핑] in this SqlMap 오류 (0) | 2023.02.27 |
---|---|
[Egov] 멤버변수 Getter and Setter 메소드 자동 생성하기 (0) | 2023.02.27 |
[Egov] Maven 빌드 오류 Perhaps you are running on a JRE rather than a JDK (0) | 2023.02.20 |
[Egov] 전자정부 표준 프레임워크 Internationalization(국제화) (0) | 2022.04.01 |
[Egov] 전체 검색, 조건 검색 Query 적용하기 (0) | 2021.12.27 |