Programming/Java

[JAVA] Exception보다 RuntimeException을 상속받는 게 좋은 이유

아이바 2025. 2. 21. 09:55

현재 CouponBoxException은 Exception을 상속받고 있어.
하지만 특별한 이유가 없다면 RuntimeException을 상속받는 게 더 유리한 경우가 많아.
이유는 다음과 같아.


📌 1. Exception은 체크 예외 (Checked Exception)

java
복사편집
public class CouponBoxException extends Exception { // Checked Exception
  • Exception을 상속받으면 Checked Exception이 돼서,
    모든 호출하는 곳에서 try-catch 또는 throws를 강제해야 함.
  • 불필요한 예외 처리가 많아져 코드가 복잡해질 수 있음.

📌 Checked Exception의 단점 예시

java
복사편집
public void processCoupon() { try { throw new CouponBoxException(CouponBoxStatusCode.INVALID_COUPON); } catch (CouponBoxException e) { // 반드시 예외를 처리해야 함 (강제됨) System.out.println("쿠폰 예외 발생: " + e.getMessage()); } }

매번 try-catch가 강제되므로, 코드가 지저분해질 가능성이 큼.


📌 2. RuntimeException은 언체크 예외 (Unchecked Exception)

java
복사편집
public class CouponBoxException extends RuntimeException { // Unchecked Exception
  • RuntimeException을 상속받으면 Unchecked Exception이 돼서,
    호출하는 곳에서 try-catch를 강제하지 않음.
  • 예외가 발생하면 런타임 시점에 자연스럽게 전파됨.
  • 필요할 때만 try-catch를 사용할 수 있음.

📌 Unchecked Exception의 장점 예시

java
복사편집
public void processCoupon() { throw new CouponBoxException(CouponBoxStatusCode.INVALID_COUPON); } // 예외 처리가 필요하면 컨트롤러 레벨에서 한 번만 처리 가능 @ExceptionHandler(CouponBoxException.class) public ResponseEntity<String> handleCouponException(CouponBoxException e) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); }

예외 처리를 강제하지 않으면서, 한 곳에서만 효율적으로 처리할 수 있음.


📌 3. 스프링과 같은 프레임워크에서 Unchecked Exception이 더 유리

  • 스프링에서는 @ExceptionHandler, @ControllerAdvice 등을 활용해 전역 예외 처리를 많이 함.
  • Unchecked Exception이면, 서비스 레이어에서 예외를 던지기만 하면 되고, 컨트롤러 단에서 한 번에 처리 가능함.
  • Checked Exception을 쓰면 모든 메서드에 throws를 붙이거나 try-catch를 해야 해서 불편함.

📌 결론: 특별한 경우가 아니면 RuntimeException을 쓰는 게 더 좋음!

✅ Checked Exception (Exception 상속)

  • 반드시 try-catch 또는 throws가 필요함 → 코드가 복잡해질 수 있음.
  • 파일 I/O, 네트워크 에러처럼 반드시 처리해야 하는 예외에 적합.

✅ Unchecked Exception (RuntimeException 상속)

  • try-catch 강제가 없고, 예외가 전파됨 → 코드가 간결해짐.
  • 대부분의 비즈니스 로직 예외는 RuntimeException을 쓰는 게 유리함.
  • 스프링의 전역 예외 처리 (@ExceptionHandler)와 잘 어울림.

👉 그래서 CouponBoxException도 RuntimeException을 상속받는 게 더 적절해! 🚀

728x90