게시물에 이미지 파일을 업로드 하는 기능을 만들고있다
S3를 이용하였고 이미지 업로드와 URL을 DB에 저장하는 것까지 완성되었다
이제 예외처리를 해줘야 하기 때문에 두 가지 예외상황을 가정하였다
이 두 가지 상황에 대해 예외 처리 시
{
status : false
message : "error message"
}
와 같은 Json형식의 응답을 보내기 위해서
@RestControllerAdvice와 @ExceptionHandler를 사용하기로 했다
이는 전역적으로 예외를 처리할 수 있는 어노테이션으로 @ControllerAdvice와 @ResponseBody를 합쳐놓은 어노테이션이다
그렇기 때문에, @RestController와 같이 응답을 Json으로 보내준다
이 어노테이션을 사용하면 try-catch로 예외처리 또는 @ExceptionHandler를 단독으로 사용하는 것보다 가독성을 높일 수 있다
이 어노테이션을 메서드에 선언하고 특정 예외 클래스를 지정해주면 해당 예외가 발생했을 때 메서드에서 정의한 로직으로 예외를 처리해 줄 수 있다
일반 컨트롤러 단에 있는 메서드에서도 단독으로 사용할 수 있다
이 경우에는 그 컨트롤러에 한해서만 적용된다
@RestControllerAdvice(assignableTypes = [AwsS3Controller::class])
class UploadLogExceptionHandler {
@ExceptionHandler(value = [MaxUploadSizeExceededException::class, IllegalArgumentException::class]) //예외 클래스 지정
fun handleException(e: RuntimeException): ResponseEntity<HashMap<String, Any>> {
//해시맵에 false와 에러메시지를 넣고 ResponseEntity객체에 담아 반환
val result: HashMap<String, Any> = HashMap<String, Any>()
result.put("status", false)
result.put("message", e.message as String)
return ResponseEntity<HashMap<String, Any>>(result, HttpStatus.FORBIDDEN)
}
}
@Service
class UploadLogService(private val uploadUtils: UploadUtils) {
...생략...
for ((index, file) in files.withIndex()) {
//IllegalArgumentException예외 throw 시
//UploadLogExceptionHandler 호출
if(uploadUtils.isNotImageFile(file.originalFilename as String))
throw IllegalArgumentException("png, jpeg, jpg에 해당하는 파일만 업로드할 수 있습니다.");
...생략...
}
}