[Spring/Kotlin] @ExceptionHandler로 예외처리 하기

트러블 슛돌이·2023년 7월 10일

사용동기

게시물에 이미지 파일을 업로드 하는 기능을 만들고있다

S3를 이용하였고 이미지 업로드와 URL을 DB에 저장하는 것까지 완성되었다

이제 예외처리를 해줘야 하기 때문에 두 가지 예외상황을 가정하였다

  1. 파일의 크기가 제한크기를 넘어가는 경우
  2. 파일의 확장자가 이미지가 아닌 경우

이 두 가지 상황에 대해 예외 처리 시

{
	status : false
    message : "error message"
}

와 같은 Json형식의 응답을 보내기 위해서

@RestControllerAdvice와 @ExceptionHandler를 사용하기로 했다

@RestControllerAdvice

이는 전역적으로 예외를 처리할 수 있는 어노테이션으로 @ControllerAdvice와 @ResponseBody를 합쳐놓은 어노테이션이다

그렇기 때문에, @RestController와 같이 응답을 Json으로 보내준다

이 어노테이션을 사용하면 try-catch로 예외처리 또는 @ExceptionHandler를 단독으로 사용하는 것보다 가독성을 높일 수 있다

@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)
    }
}

서비스 단에서 지정된 예외를 throw하면 위의 메서드가 실행

@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에 해당하는 파일만 업로드할 수 있습니다.");
 
 		...생략...
    
    }
}

0개의 댓글