μ˜ˆμ™Έ 처리 (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)

πŸ”— κ΄€λ ¨