Today Yewon Learned

[Egov] Spring MVC 구조로 파일 삭제하기 본문

Spring/Egov

[Egov] Spring MVC 구조로 파일 삭제하기

데브워니 2022. 2. 21. 10:09

[구현 목표]

콘텐츠 목록에서 사용 중인 파일은 삭제 버튼을 누르면 삭제할 수 없다는 경고창과 목록을 띄우고,

콘텐츠 목록에서 사용 중이 아닌 파일은 삭제 버튼을 누르면 삭제되도록 구현해야한다.

 

[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로 검색한 파일이 사용 중인 경우에는 파일을 삭제 하지 않고, 사용 목록을 띄워준다.

Comments