순서
1. 방향성
2. 메서드 작성
1. 방향성
이미지 삭제 기능을 수행하는 URL 매핑 메서드를 작성했습니다.
이미지 파일 삭제를 위해 가장 핵심이 되는 메서드는 File 클래스의 delete() 메서드입니다.
해당 메서드를 사용하기 위해선 File 클래스를 인스턴스화 하여 사용해야 합니다.
삭제할 파일을 대상으로 하는 File 객체를 생성하기 위해 생성자에 대상 파일의 경로인 문자열 데이터를 파라미터로 부여해야 합니다.
따라서 삭제할 대상의 파일 경로가 필요하기 때문에 URL 매핑 메서드의 파라미터로 파일 경로인 fileName을 부여했습니다.
파일 삭제를 수행하는 URL 매핑 메서드는 뷰에서 비동기 방식으로 요청을 하고 수행 결과를 반환하기 때문에 비동기 요청을 수행하도록 작성했습니다.
비동기 요청을 수행하도록 하는 선택지는 @ResponseBody 어노테이션과 ResponseEntity 객체를 반환 타입으로 하는 2가지가 있습니다.
저는 코드의 수행 결과에 따라 다른 상태 코드를 전송하기 위해 ResponseEntity 객체를 사용했습니다.
2. 메서드 작성
이미지 파일 삭제를 수행하는 URL 매핑 메서드는 AdminController.java에서 작성했습니다. 이는 이미지 파일 삭제를 관리자만 할 수 있게 하기 위함입니다.
AdminController.java에 아래의 코드를 작성합니다.
/* 이미지 파일 삭제 */
@PostMapping("/deleteFile")
public ResponseEntity<String> deleteFile(String fileName){
logger.info("deleteFile........" + fileName);
}
전달 방식은 POST 방식으로 했으며, URL은 'deleteFile'로 작성했습니다.
파일 경로 및 이름을 전달받기 위해 String 타입의 fileName 변수를 파라미터로 부여했고, 반환 타입은 ResponseEntity로 했고, HTTP Body에 String 데이터를 추가하기 위해 타입 매개 변수로 String을 부여했습니다.
URL 매핑 메서드의 구현부에 File 타입의 참조 변수를 선언하고 null로 초기화합니다.
File file = null;
try-catch
URLDecoder.decode(), File.delete() 메서드는 모두 예외를 발생시킬 가능성이 큰 메서드이기 때문에 try-catch 문을 먼저 작성했습니다.
두 메서드가 발생시킬 수 있는 예외들이 각각 다르지만 기능 구현이 목표이기 때문에 모든 예외 처리를 해주는 Exception을 catch 파라미터로 부여해줬습니다.
try {
} catch(Exception e) {
e.printStackTrace();
}
예외가 발생했다는 의미는 이미지 파일 삭제 요청이 정상적으로 처리되지 못했다는 의미이기 때문에 실패 문구를 보여주도록 return문을 catch 구현부에 작성했습니다.
try {
} catch(Exception e) {
e.printStackTrace();
return new ResponseEntity<String>("fail", HttpStatus.NOT_IMPLEMENTED);
}
URLDecoder.decode 적용 및 썸네일 파일 삭제
위의 코드에서 File 객체를 생성하기 위해 파라미터로 부여할 문자열(String) 데이터는 '/' 또는 '\'를 구분자로 하는 경로여야 하는데, 해당 구분자들이 UTF-8로 인코딩 되었기 때문에 fileName 변수에 담긴 데이터 자체만으로 삭제 대상 파일을 지정할 수 없습니다.
그래서 fileName에 담긴 데이터를 디코딩(Decoding)해주기 위해 URL Decoder 클래스의 decode() 메서드를 사용했습니다.
decode() 메서드는 static 메서드이기 때문에 인스턴스화 없이 사용 가능합니다.
첫 번째 파라미터는 디코딩할 대상 문자열이고, 두 번째 파라미터는 대상 문자열 데이터가 어떠한 타입으로 인코딩 되었는지에 대한 정보입니다.
리턴 타입은 디코딩된 문자열(String) 데이터입니다.
삭제할 파일을 대상으로 하는 File 클래스를 인스턴스화 하여 앞서 선언한 file 참조 변수가 참조하도록 했습니다.
try {
file = new File("c:\\upload\\" + URLDecoder.decode(fileName, "UTF-8"));
} catch(Exception e) {
e.printStackTrace();
return new ResponseEntity<String>("fail", HttpStatus.NOT_IMPLEMENTED);
}
delete() 메서드를 호출하여 대상 파일을 삭제하도록 작성했습니다.
try {
file = new File("c:\\upload\\" + URLDecoder.decode(fileName, "UTF-8"));
file.delete();
} catch(Exception e) {
e.printStackTrace();
return new ResponseEntity<String>("fail", HttpStatus.NOT_IMPLEMENTED);
}
원본 파일 삭제
업로드 당시 이미지 원본 파일과 썸네일 이미지를 생성 및 저장했습니다. 따라서 원본 파일도 삭제해줬습니다.
원본 파일 대상 File 객체를 생성해주기 위해 파일 경로의 문자열 데이터가 필요합니다.
썸네일 파일의 File 객체를 생성했을 때와 같이 경로와 fileName 데이터를 합친 후 String 클래스의 replace를 통해 "s_" 문자를 없애주어도 되지만, 이미 경로의 정보를 가지고 있는 File 객체가 존재하기 때문에 해당 객체를 활용했습니다.
File 클래스의 getAbsolutePath() 메서드를 호출하여 대상 File 객체의 경로를 문자열(String) 타입의 데이터로 변환해줍니다.
String 타입의 originFileName 변수를 선언한 후 원본 파일 경로를 문자열(String) 데이터로 초기화합니다.
String 클래스의 replace() 메서드는 첫 번째 파라미터로 지정한 문자열 데이터를 찾아서 두 번째 파라미터로 지정한 문자열 데이터로 치환해주는 역할을 합니다.
try {
/* 썸네일 파일 삭제 */
file = new File("c:\\upload\\" + URLDecoder.decode(fileName, "UTF-8"));
file.delete();
/* 원본 파일 삭제 */
String originFileName = file.getAbsolutePath().replace("s_", "");
} catch(Exception e) {
e.printStackTrace();
return new ResponseEntity<String>("fail", HttpStatus.NOT_IMPLEMENTED);
}
본 파일을 대상으로 하는 File 객체를 생성한 후 이를 기존에 선언하고 사용했던 file 변수가 참조하도록 했습니다.
썸네일 이미지 삭제 과정과 동일하게 원본 파일 이미지를 삭제하도록 delete() 메서드를 호출합니다.
try {
/* 썸네일 파일 삭제 */
file = new File("c:\\upload\\" + URLDecoder.decode(fileName, "UTF-8"));
file.delete();
/* 원본 파일 삭제 */
String originFileName = file.getAbsolutePath().replace("s_", "");
file = new File(originFileName);
file.delete();
} catch(Exception e) {
e.printStackTrace();
return new ResponseEntity<String>("fail", HttpStatus.NOT_IMPLEMENTED);
}
return
try-catch 문에서 예외가 발생하지 않은 것은 정상적으로 삭제 작업을 수행했다는 것이므로 성공 상태 코드와 성공과 관련된 문자열을 뷰로 전송해주도록 return 문을 작성했습니다.
return new ResponseEntity<String>("success", HttpStatus.OK);
'😎 STS3 Spring 쇼핑몰' 카테고리의 다른 글
STS3 쇼핑몰 프로젝트[27] 업로드 이미지 정보 등록 - 1 (0) | 2022.10.01 |
---|---|
STS3 쇼핑몰 프로젝트[26] 업로드 이미지 삭제 - 2 (0) | 2022.09.30 |
STS3 쇼핑몰 프로젝트[25] 업로드 된 이미지 출력 - 2 (0) | 2022.09.29 |
STS3 쇼핑몰 프로젝트[25] 업로드 된 이미지 출력 - 1 (0) | 2022.09.28 |
STS3 쇼핑몰 프로젝트[24] 상품 이미지 업로드(서버 단계 이미지 파일 체크) - 7 (0) | 2022.09.28 |