Error 처리하기

|

Error 처리하는 방법

Json 파싱 에러 처리

ErrorHandler.kt 파일을 만들고 다음과 같이 작성하면 됩니다.

@ControllerAdvice
class ErrorHandler {

    @ExceptionHandler(JsonParseException::class)
    fun JsonParseExceptionHandler(servletRequest: HttpServletRequest, exception: Exception)
            : ResponseEntity<String> {
        return ResponseEntity("JSON Parsing Error", HttpStatus.BAD_REQUEST)
    }
}

하지만 이 경우는 String으로 리턴하기 때문에 RESTful API에는 어울리지 않습니다. 에러도 JSON 포맷으로 리턴하는 것이 좋습니다.


ErrorResponse.kt

data class ErrorResponse(val error: String, val message: String)


ErrorHandler.kt

@ControllerAdvice
class ErrorHandler {

    @ExceptionHandler(JsonParseException::class)
    fun JsonParseExceptionHandler(servletRequest: HttpServletRequest, exception: Exception)
            : ResponseEntity<ErrorResponse> {
        return ResponseEntity(
                ErrorResponse("JSON Parsing Error", exception.message ?: ""),
                HttpStatus.BAD_REQUEST)
    }
}


다양한 Exception 처리

여기에 좀 더 다양한 Exception 처리를 하려면 다음과 같이 추가로 예외 처리를 작성할 수 있습니다.

ErrorResponse.kt

data class ErrorResponse(val error: String, val message: String)


UserNotFoundException.kt

class UserNotFoundException(message: String) : Exception(message)


ErrorHandler.kt

@ControllerAdvice
class ErrorHandler {

    @ExceptionHandler(JsonParseException::class)
    fun JsonParseExceptionHandler(servletRequest: HttpServletRequest, exception: Exception)
            : ResponseEntity<ErrorResponse> {
        return ResponseEntity(
                ErrorResponse("JSON Parsing Error", exception.message ?: ""),
                HttpStatus.BAD_REQUEST)
    }

    @ExceptionHandler(UserNotFoundException::class)
    fun UserNotFoundExceptionHandler(servletRequest: HttpServletRequest, exception: Exception)
            : ResponseEntity<ErrorResponse> {
        return ResponseEntity(
                ErrorResponse("User Not Found", exception.message ?: ""),
                HttpStatus.NOT_FOUND)
    }
}


UserController.kt

@RestController
class UserController {

    @Autowired
    private lateinit var service: UserService

    @GetMapping("/user/{id}")
    fun getUser(@PathVariable id: Int): ResponseEntity {
        val user = service.getUser(id) ?: throw UserNotFoundException("user($id) does not exist.")
        return ResponseEntity(user, HttpStatus.OK)
    }
}
</pre>