μμΈ μ²λ¦¬ (Exception Handling)
π κ°μ
- Spring MVCλ μ μ μμΈ μ²λ¦¬μ 컨νΈλ‘€λ¬ λ¨μ μμΈ μ²λ¦¬λ₯Ό μ§μνλ€.
- μ ν리μΌμ΄μ μμ λ°μν μμΈλ₯Ό μ€μμ§μ€μ μΌλ‘ κ΄λ¦¬ν΄ μ μ§λ³΄μμ±μ λμΈλ€.
- Checked/Unchecked μμΈμ μ°¨μ΄λ₯Ό μ΄ν΄νλ©΄ μ μ ν μμΈ μ€κ³λ₯Ό ν μ μλ€.
βπ» νμ€ μμ½
Spring MVC μμΈ μ²λ¦¬λ @ControllerAdvice
+ @ExceptionHandler
μ‘°ν©μΌλ‘ μ μ/λ‘컬 μ²λ¦¬ κ°λ₯νλ©°, λλΆλΆμ Spring μμΈλ UncheckedException(RuntimeException) κΈ°λ°μ΄λ€.
π€ μ νμνκ°?
- 컨νΈλ‘€λ¬λ§λ€ μμΈ μ²λ¦¬ λ‘μ§μ μ€λ³΅ μμ±νλ λΉν¨μ¨ μ κ±°
- 곡ν΅λ μμΈ μλ΅ νμμ μ μ§
- μ€λ₯ νμ΄μ§/JSON μλ΅ λ± λ€μν ν¬λ§· μ§μ
- μμΈ μμΈμ λ‘κΉ νκ³ , ν΄λΌμ΄μΈνΈμλ νμν μ λ³΄λ§ λ ΈμΆ
βοΈ μ£Όμ κ΅¬μ± μμ
@ControllerAdvice
- μ μ μμΈ μ²λ¦¬ ν΄λμ€μ μ μΈ
- λͺ¨λ 컨νΈλ‘€λ¬μ κ³΅ν΅ μ μ© κ°λ₯
@ExceptionHandler
- νΉμ μμΈ νμ μ μ²λ¦¬νλ λ©μλ μ μ
- λ©μλ νλΌλ―Έν°λ‘ μμΈ κ°μ²΄, μμ²/μλ΅, λͺ¨λΈ λ±μ λ°μ μ μμ
- λ¦¬ν΄ νμ
μ View μ΄λ¦, λ°μ΄ν° κ°μ²΄,
ResponseEntity
λ± λ€μ
CheckedException
Exception
μμ,RuntimeException
λΉν¬ν¨- λ°λμ μ²λ¦¬(
try-catch
λλthrows
)ν΄μΌ ν¨ - μ»΄νμΌ μ κ°μ
- ex)
IOException
,SQLException
UncheckedException
RuntimeException
μμ- μ²λ¦¬ κ°μ μμ (μ»΄νμΌ μλ¬ X)
- νΈμΆ κ³μΈ΅μμ μ μ ν μμΉμμ μ²λ¦¬ νμ
- Spring μμΈ λλΆλΆμ΄ ν΄λΉ
π§ μμ
(A) μ μ μμΈ μ²λ¦¬
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public String handleUserNotFound(UserNotFoundException ex, Model model) {
model.addAttribute("exception", ex);
return "error";
}
}
(B) 컨νΈλ‘€λ¬ λ¨μ μμΈ μ²λ¦¬
@Controller
public class UserController {
@GetMapping("/users/{id}")
public String getUser(@PathVariable Long id) {
throw new UserNotFoundException();
}
@ExceptionHandler(UserNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public void notFound() {
// No content
}
}
(C) JSON μλ΅ μμΈ μ²λ¦¬
@ControllerAdvice
public class ApiExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public ErrorDto handleException(Exception ex) {
return new ErrorDto("ERR001", ex.getMessage());
}
}
β οΈ μ£Όμν μ
@ControllerAdvice
λ@RestControllerAdvice
λ‘ λ체 κ°λ₯ (λͺ¨λ μλ΅μ μλ@ResponseBody
)- μμΈ μ²λ¦¬ μ λ―Όκ°ν μλ² λ΄λΆ μ 보λ₯Ό ν΄λΌμ΄μΈνΈμ λ ΈμΆνμ§ λ§ κ²
- CheckedExceptionμ μλμ μΈ μμΈ νλ¦ μ μ΄κ° νμν κ²½μ°μλ§ μ¬μ©
- HTTP μν μ½λ λͺ
μ (
@ResponseStatus
λλResponseEntity
)